nyagos では、子プロセスのバッチファイルが変更した環境変数を取り込むのに
@call バッチファイル 引数1 引数2 … @set ERRORLEVEL_=%ERRORLEVEL% @(cd & set) > 一時ファイル名 @exit /b %ERRORLEVEL_%
といった踏み台バッチを毎回作っていた。
これはこれでコストなので、バッチファイルではなく、環境変数に踏み台コードを格納してみた。具体的には環境変数 NYAGOSCMDLINE に
call バッチファイル 引数1 引数2 … & set ERRORLEVEL_=!ERRORLEVEL! & (cd & set) > 一時ファイル名
といったテキストを格納し、これを
CMD.EXE /V:ON /C "%NYAGOSCMDLINE%"
という形で呼び出すようにした。
なぜ、環境変数に一旦保存するかというと、CMD.EXE に二重引用符を含むかもしれない文字列を渡す時、そのままだと簡単に誤動作するからである。
(このあたりはCMD /? で出てくるヘルプによると、オプションを調整すると回避できるはずなのだが、正直、意味不明で理解が難しい※)
ただ、この方式だと、/V:ON オプションがつくので本命のバッチファイルの中で「!環境変数名!
」という語句が遅延展開されてしまう。今のところ、これ解消する手立てがないのだなぁ。まぁ、これで誤動作することは滅多にないと思うんだが…うーむ
※ (2018.11.12 追記)
オプションの意味が分かったので、最終的には環境変数ではなく、 CMD.EXEの引数での引用符の扱いを完全に理解した に記載のとおり、コマンドラインにベタに書く方法を使うようにした。