72006


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

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

[code]

    powershell.exe start-process -FilePath 'TestEnv.cmd' -ArgumentList '\"a\" \"B C\" \"d\"' -Verb Open
    
[/code]

(b)ＵＡＣ確認後、起動しない。

[code]

    powershell.exe start-process -FilePath 'TestEnv.cmd' -ArgumentList '\"a\" \"B C\" \"d\"' -Verb RunAs
    
[/code]

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

[code]

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


CC BY-SA 4.0
2020-11-15T11:24:14.203
71968
2020-11-17T08:53:23.357
2020-11-17T08:53:23.357
4236
42735
question
windows powershell cmd
powershell.exe start-process -Verbオプション使用時の"\"について


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

[code]

    powershell.exe start-process -FilePath 'cmd.exe' -ArgumentList '/C "path\to\TestEnv.cmd" \"a\" \"B C\" \"d\"' -Verb open
    powershell.exe start-process -FilePath 'cmd.exe' -ArgumentList '/C "path\to\TestEnv.cmd" \"a\" \"B C\" \"d\"' -Verb runas
    
[/code]

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

* * *

調査したこと：

>
[code]

>     powershell.exe start-process -FilePath 'TestEnv.cmd' -ArgumentList
> '\"a\" \"B C\" \"d\"' -Verb Open
>  
[/code]

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

[code]

    C:\WINDOWS\system32\cmd.exe /c ""C:\Users\sayuri\TestEnv.cmd" "a" "B C" "d" "
    
[/code]

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

>
[code]

>     powershell.exe start-process -FilePath 'TestEnv.cmd' -ArgumentList
> '\"a\" \"B C\" \"d\"' -Verb RunAs
>  
[/code]

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

[code]

    "C:\WINDOWS\System32\cmd.exe" /C "C:\Users\sayuri\TestEnv.cmd" "a" "B C" "d" 
    
[/code]

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

[code]

    'C:\Users\sayuri\TestEnv.cmd" "a" "B' is not recognized as an internal or external command,
    operable program or batch file.
    
[/code]

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


CC BY-SA 4.0
2020-11-17T08:53:06.117
72006
2020-11-17T08:53:06.117
4236
71968
answer