標準愚痴出力

個人的なIT作業ログです。もしかしたら一般的に参考になることが書いているかもしれません(弱気

nyagos でのバッチ起動方法を軽量化した

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の引数での引用符の扱いを完全に理解した に記載のとおり、コマンドラインにベタに書く方法を使うようにした。