Windows Powershellの話。Start-ProcessコマンドレットにArgumentListという引数がある。ここにはstring型の配列を指定することでプロセスに渡す引数を指定する。

では、こんなスクリプトを作ってみる。

$exepath="app.exe"
$infilepath="file 123.txt"
start-process -wait $exepath -argumentlist "-sw1" , $infilepath, "-sw2"

文字列にスペースが含まれているが、それを一つのstring型変数に入れた状態でArgumentListのstring配列の一つとしてStart-Processに渡している。

一見これは問題ないように見えるが、実行してみるとプロセスは意図していたとおりに実行されない。どうも、ArgumentList引数に渡されたstring配列はコマンド解釈の時点で単純に一つの文字列として結合されるらしい。つまり、ArgumentListのカンマ区切りは+(文字列結合)に等しく、これが配列としてプロセスに渡されるわけではないということ。極端な話、カンマなんて無きに等しいと。

ちなみにWindowsの内部的には、コマンド実行時の引数は一つ続きの文字列データとしてアプリケーションに渡される。

山内の授業補完のページ/Windowsアプリ/argcとargv
http://pepper.is.sci.toho-u.ac.jp/index.php?%BB%B3%C6%E2%A4%CE%BC%F8%B6%C8%CA%E4%B4%B0%A4%CE%A5%DA%A1%BC%A5%B8%2FWindows%A5%A2%A5%D7%A5%EA%2Fargc%A4%C8argv

Windowsの仕様でどうにもならないことかもしれないが、PowerShellに落胆させられた瞬間だった。


comments powered by Disqus

※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい.

(C) 2008-2017 akm. Style based on sakmug. Host powered by Xdomain