つまるところ
vcvarsall.batがエラーになる原因は、if文の条件部分もしくは()内でシンタックスチェック前に環境変数が展開され、2重にダブルクォーテーションで囲まれてしまう部分ができたり()で囲まれた部分が出てきてしまうためであった。
具体的に言うと
if not "%WindowsSdkDir_old%" == "" ( set "PATH=%WindowsSdkDir_old%bin\NETFX 4.0 Tools;!WindowsSdkDir_35!;%PATH%" )
%PATH%のところがシンタックスチェックよりも先に展開されてしまうので、%PATH%の中に()や""が入っているとエラーになってしまうのだ。
環境変数の遅延評価
この問題を回避するために「環境変数の遅延評価」を使う方法がある。「環境変数の遅延評価」とは実行時に変数の中身を展開するというものである。シンタックスチェック前に展開されなくなるので問題解決となる。
環境変数の遅延評価は、遅延評価をONにして%を!に置き換えることで使用できる。
if not "%WindowsSdkDir_old%" == "" ( set "PATH=!WindowsSdkDir_old!bin\NETFX 4.0 Tools;!WindowsSdkDir_35!;!PATH!" )
遅延評価機能をONにするにはcmd.exeを/v:onオプションで実行するかバッチ中でsetlocal enabledelayedexpansionを実行すればよい。
vcvarsall.batに適用してみた
これをvcvarsall.batに適用してみたんだけれども、setlocalでの指定だとPATHの変更範囲がバッチが終了するともとに戻るので/v:onオプションをしていしてバッチを実行しないといけなかった。さらにBoostのビルド自体が内部でvcvarsall.batを呼び出していてその時は遅延評価がONにならないのでPATHがうまくセットされずコンパイラが見つからないエラーが発生した。レジストリでCMD.exeの遅延評価をデフォルトでONにしてみたけど結果は同じだった。何か別の問題(凡ミスも含む)があるのかもしれない。