それから、これも空白スペース絡みなんだけど、コマンドプロンプトからPowerShellスクリプトを実行して引数に空白スペースが紛れ込む場合。
sample.ps1
# C:\Users\arimasou16\Documents\sample.ps1
Param(
[String]$Arg1, #$Arg1は文字列型,
[String]$Arg2 #$Arg2は文字列型で宣言
)
Write-Host $Arg1
Write-Host $Arg2
上記のようなPowerShellスクリプトで以下のようにコマンドプロンプトで実行するとパラメーターをスペースで分割されて解釈されてしまう。
C:\Users\arimasou16\Documents>powershell .\sample.ps1 "a b" "ef c g"
a
b
念の為に書いておくと、powershell
起動後においては、問題なくパラメーターが分割されることなく実行できる。
PS C:\Users\ariamsou16\Documents> .\sample.ps1 "a b" "ef c g"
a b
ef c g
ググってみると、 空白を含むパラメータをバッチファイルに指定するには?などでは
シングルコーテーションで括る
C:\Users\arimasou16\Documents>powershell .\sample.ps1 'a b' 'ef c g'
a b
ef c g
空白スペースをエスケープする
C:\Users\arimasou16\Documents>powershell .\sample.ps1 "a` b" "ef` c` g"
a b
ef c g
ダブルコーテーションをエスケープする(\"
もしくは"""
)
C:\Users\arimasou16\Documents>powershell .\sample.ps1 "\"a b\" \"ef c g\""
a b
ef c g
C:\Users\arimasou16\Documents>powershell .\sample.ps1 """a b""" """ef c g"""
a b
ef c g
など解決策が提示されている。しかし、個人的に一番楽だなぁと思ったのは-file
でスクリプトファイル名を指定して、その後のパラメーターをスクリプトのパラメーターとして解釈させる方法。エスケープ不要で分かりやすい。
-file
オプションを指定する
C:\Users\arimasou16\Documents>powershell -file .\sample.ps1 "a b" "ef c g"
a b
ef c g
Powershellで引数を受け取る | マイクロソフ党ブログにあるように、パラメーター宣言してしまって、明示的にどの引数に値を渡すか示してあげればより親切。
C:\Users\arimasou16\Documents>powershell -file .\sample.ps1 -arg2 "ef c g" -arg1 "a b"
a b
ef c g