2

スクリプトは CLI 用に作成されており、Microsoft の世界では、ファイルを参照するスクリプト引数には、引用符で囲む必要のあるスペースが含まれていることがよくあります。

これは私にとって問題であることがわかりました。次のスクリプトを検討してください。

#testarg.ps1 
for($i=0; $i -lt $args.length; $i++)
{
    write-host "Arg$i = $($args[$i])"
} 

次のように、PowerShell インタラクティブ環境内で実行すると、次のようになります。

PS C:\script> .\testarg.ps1 "first arg"  "second arg"

予想通り、

Arg0 = first arg
Arg1 = second arg

しかし、スクリプトの通常の使用は、インタラクティブ モード以外ではバッチ モードです。私が理解している限り、Microsoftがスクリプトを実行する方法を提案しcmd.exeているようですpowershell.exe path\to\script.ps1(パスにスペースなし)。しかし:

powershell.exe .\testarg.ps1 "first arg"  "second arg"

一貫性のない結果が得られます。

Arg0 = first
Arg1 = arg
Arg2 = second
Arg3 = arg 

意図した結果を得るために、一重引用符を使用できることに注意しました。

powershell.exe .\testarg.ps1 'first arg' 'second arg'

しかし、これは、引数を自動的に生成して渡す GUI ツールによってスクリプトが実行される場合、および/または引用符の使用における一貫性の理由からより多くの CLI ツールが存在する場合には、実行できないことがよくあります。

-fileオプションを使用するときの何らかの理由:

powershell.exe –file .\testarg.ps1 "first arg"  "second arg"
::(reference to relative path '.\' is optional)

意図した結果が再び得られます。

Arg0 = first arg
Arg1 = second arg

したがって、-fileオプションを使用すると、二重引用符が適切に機能します。ps1これは、ファイルの Windows ファイル タイプの関連付け(を使用FTYPE.exe) を次のように再マップできることを示唆しています。

FTYPE Microsoft.PowerShellScript.1=C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -file "%1" %*

FTYPE 関連付けがあれば、次のように書くだけで意図した結果を得ることができます。

testarg.ps1 "first arg"  "second arg"

後者は私にとって非常に満足のいくものですが、私は PowerShell の初心者なので、次のことを疑問に思います。

  1. 一般的なスクリプトの場合、バッチ フォームpowershell.exe –file path\to\script.ps1とインタラクティブ フォーム (PowerShell 内から) はPS > path\to\script.ps1同等ですか? 2 つの形式が異なる出力/効果を生成する場合がありますか?
  2. コマンド ラインをそのまま (二重引用符を削除せずに) 読み取るためのスクリプト内の解決策はありますか? のような*%ものcmd.exe
4

1 に答える 1

1

あなたが書いたときに私が理解できないことが1つあります:

testarg.ps1 "first arg"  "second arg"

どのバッチ内でそれを呼び出していますか?

からPowerShell.exe、それは書かれるべきです:

cd "c:\Temp"
& .\testarg.ps1 "first arg"  "second arg"

それからcmd.exe書かれるべきです:

powershell –file .\testarg.ps1 "first arg" "second arg"
于 2012-12-23T19:50:46.030 に答える