powershell.exe start-process -Verbオプション使用時の””について

投稿者: Anonymous

よろしくお願いいたします。
Windows10のコマンドプロンプトでPowershellを利用し管理者権限でコマンドを実行しようとしています。
以下のa,b,cの3つを試すと"RunAs"での起動が思うようにできません。
解決方法がわかる方はいらっしゃいますか?

(a)正常に実行できる。引数も正しく渡される。

powershell.exe start-process -FilePath 'TestEnv.cmd' -ArgumentList '"a" "B C" "d"' -Verb Open

(b)UAC確認後、起動しない。

powershell.exe start-process -FilePath 'TestEnv.cmd' -ArgumentList '"a" "B C" "d"' -Verb RunAs

(c)起動できますが引数の"ダブルクォーテーションが反映されず"B C"は別々に認識されてしまう。

powershell.exe start-process -FilePath 'TestEnv.cmd' -ArgumentList '"a" "B C" "d"' -Verb RunAs

解決

拡張子.cmdはOSが直接実行できず、cmd.exeが解釈して実行します。PowerShell及びその下位レイヤーがcmd.exeを起動する際に渡す引数とcmd.exeが渡された引数を解釈方法に齟齬があるため、期待する引数を確実に渡すことができないようです。

powershell.exe start-process -FilePath 'cmd.exe' -ArgumentList '/C "pathtoTestEnv.cmd" "a" "B C" "d"' -Verb open
powershell.exe start-process -FilePath 'cmd.exe' -ArgumentList '/C "pathtoTestEnv.cmd" "a" "B C" "d"' -Verb runas

のように.cmdを起動するのではなく、cmd.exeを起動することにより-Verbによる差異を受けないようにするといいでしょう。


調査したこと:

powershell.exe start-process -FilePath 'TestEnv.cmd' -ArgumentList '"a" "B C" "d"' -Verb Open

この方法で起動されるプロセス及び引数は

C:WINDOWSsystem32cmd.exe /c ""C:UserssayuriTestEnv.cmd" "a" "B C" "d" "

であり、-FilePath""で括られた上で更に-FilePath-ArgumentListを含めた全体が""で括られている。
cmd.exeは外側の"を削除してから解釈するため期待通り"C:UserssayuriTestEnv.cmd"が実行される。

powershell.exe start-process -FilePath 'TestEnv.cmd' -ArgumentList '"a" "B C" "d"' -Verb RunAs

この方法で起動されるプロセス及び引数は

"C:WINDOWSSystem32cmd.exe" /C "C:UserssayuriTestEnv.cmd" "a" "B C" "d" 

であり、-FilePath""で括られている。
cmd.exeは外側の"を削除してから解釈する。その際、""の対を考慮して空白までの文字列として
C:UserssayuriTestEnv.cmd" "a" "Bという実行ファイルを探しに行くため

'C:UserssayuriTestEnv.cmd" "a" "B' is not recognized as an internal or external command,
operable program or batch file.

というエラーが発生している。

回答者: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *