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
https://pepper.is.sci.toho-u.ac.jp/pepper/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に落胆させられた瞬間だった。


※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい。コメントはスパム防止フィルターによる承認制のため、投稿してもすぐに反映されない場合があります。

管理人 : Akamaki (akm)

は、PCとVTuberに夢中になっている電気技術者です。

私はレトロコンピューティングの愛好家ですが、そのようなリグはもう収集していません。

私の活動はトップページで見ることができます。読んでくれてありがとう!