コマンドプロンプトでコマンド(アプリ)を引数付きで起動したとき、引数のダブルクオートがどう解釈されるかの実験
通常(ダブルクオートなし)
1 2 3 4 5 6 7 8 9 |
> app.exe aaa bbb ccc CRT Argument 1: aaa CRT Argument 2: bbb CRT Argument 3: ccc |
スペースなしの文字列をダブルクオート
1 2 3 4 5 6 7 8 9 |
> app.exe "aaa" bbb "ccc" CRT Argument 1: aaa CRT Argument 2: bbb CRT Argument 3: ccc |
ダブルクオートで囲ってもプログラム内では現れない。(mainのargvの話)
スペースありの文字列をダブルクオート
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
> app.exe "a a a" b b b "c c c" CRT Argument 1: a a a CRT Argument 2: b CRT Argument 3: b CRT Argument 4: b CRT Argument 5: c c c |
ダブルクオートで囲むと1つの引数として扱われる
スペースなしの文字列をシングルクオート
1 2 3 4 5 6 7 8 9 |
> app.exe 'aaa' bbb 'ccc' CRT Argument 1: 'aaa' CRT Argument 2: bbb CRT Argument 3: 'ccc' |
シングルクォートはダブルクオートとは違い引数に現れる。Windowsではシングルクォートは特別な文字列ではないようだ。
スペースありの文字列をシングルクオート
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
> app.exe 'a a a' b b b 'c c c' CRT Argument 1: 'a CRT Argument 2: a CRT Argument 3: a' CRT Argument 4: b CRT Argument 5: b CRT Argument 6: b CRT Argument 7: 'c CRT Argument 8: c CRT Argument 9: c' |
シングルクォートは特別な文字でないことがわかる。
ではプログラム内でダブルクオート文字列、例えば“abc”を受け取りたい場合はどうしたらいいだろうか。結論から言うと3つのダブルクオートでabcを囲めばいい。
1 2 3 4 5 6 7 8 9 |
> app.exe """aaa""" """bbb""" """ccc""" CRT Argument 1: "aaa" CRT Argument 2: "bbb" CRT Argument 3: "ccc" |
3つのダブルクオートは以下のように解釈される。
- 開始ダブルクオート
- 終了ダブルクオート
- 終了ダブルクオート直後のダブルクオートは通常文字として扱われるダブルクオート
あるいは2つのダブルクオートで1つのダブルクオートと解釈される。
この形式はCランタイムとWin32APIのCommandLineToArgvWで扱い方が違うようなので、以下の場合には使えない。
プログラム内でabc=”xyz = 123″を受け取りたい場合。
1 2 3 |
> app.exe "abc=\"xyz = 123\"" CCommandLineString Argument 1: abc="xyz = 123" |
\でエスケープできる。
引数を表示するアプリ
引数を解釈して表示してくれるアプリ、開発のときの確認用。あるいは長い引数をとるアプリのときプログラム内部でどう受け取られるかの確認用。CRTとCommandLineToArgvWと独自実装で表示する。
https://github.com/ambiesoft/argCheck/releases