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