有馬総一郎のブログ

(彼氏の事情)

コマンドプロンプトからPowerShell起動時に、空白スペースが紛れた値を、分割されず引数として渡したい

それから、これも空白スペース絡みなんだけど、コマンドプロンプトからPowerShellスクリプトを実行して引数に空白スペースが紛れ込む場合。

sample.ps1
1
2
3
4
5
6
7
# 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

Comments