cmd.exeのひどい引数解釈

cmd.exe のコマンドラインの仕様を解析してみた - 永遠に未完成を読んで、がぜん試してみたくなった。いやだって、引数として

^"puts \^"Hello, world\^"^"

を渡すと複雑怪奇なエスケープ処理が走り、結果、プログラムには

puts "Hello, world"

だけが渡されるって…。

ということで受け取った引数を行ごとに分割して表示するプログラムを書く:

#include <iostream>
#include <algorithm>
int main(int argn, char **args)
{
  std::copy(args, args + argn,
    std::ostream_iterator<char*>(std::cout, "\n"));
  return 0;
}

これをコンパイルして実行:

> cl /EHsc echo.cc && echo.exe ^"puts \^"Hello, world\^"^"
...
echo.exe
puts "hello, world"

ほんとだ…。これはひどい

それにしてもヒアドキュメントが使えないとか、 Windowsコマンドラインシェルは使いにくいなあ。