Windowsのコマンドプロンプト上でのダブルクォート(")について、ちょっと分かりにくい挙動があったので、ここにメモしておく。
例えば、コマンドプロンプト上で、
test.bat "abc def"
は問題なく実行できる。
しかし、
test.bat "abc def" <
は「コマンドの構文が誤っています。」となり実行できない。これは、「<」がダブルクォートの範疇からはずれているので、コマンドプロンプトが、ただの文字ではなくファイルからの入力である、と解釈したためだと考えられる。
では、
test.bat "abc def" "<
だと、どうだろうか?これは問題なく実行できる。test.bat 内では、第1引数は「"abc def"」になり、第二引数は「"<」となる。「<」はただの文字として解釈されている。
ダブルクォートが閉じていないのにコマンドプロンプト上でちゃんと解釈されるのは不思議だ。他の言語ならエラーになるだろう。
念のため、以下はどうだろう?
test.bat "abc def" "<"
これも問題なく実行できる。test.bat 内では、第1引数は「"abc def"」になり、第二引数は「"<"」となる。
ここまでを纏めると、ダブルクォートはコマンドプロンプト上で特殊な意味を持つ文字をエスケープできる(ただの文字化できる)。また、ダブルクォートで囲われていなくても開始のダブルクォートがあれば、エスケープは有効になる、ということが分かった。
なお、上記はWindows7で実機検証した結果をもとに書いているが、他のバージョンのWindowsでも挙動は変わらないと思う。たぶん。