標準愚痴出力

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

NYAGOS 4.2.5βが、いかにしてバッチファイルでの環境変数の変更取り込みを可能としたか

  1. 通常、環境変数は親プロセスから子プロセスへの一方通行で継承されるものであり、逆はありえない。
  2. CMD.EXE で「環境変数設定バッチ」というものが成り立つのは、バッチファイルを子プロセスではなく、バッチファイルを呼び出しているCMD.EXEプロセス自身でバッチファイルを読み取り、実行しているから
  3. 故に、バッチファイルを「子プロセスの CMD.EXE」で呼び出している NYAGOS では、CMD.EXEのような環境変数設定用のバッチファイルを期待通りに利用することはできないはず

だが、しかし:

set F=%TIME%
cd "%TEMP%"

このバッチファイルを実行する時、4.2.5βでは、かわりに次のようなバッチファイルを生成・実行する。

@call t\batchtst.cmd
@set "ERRORLEVEL_=%ERRORLEVEL%"
@(cd & set) > "C:\Users\(ユーザ名)\AppData\Local\Temp\nyagos-11428.tmp"
@exit /b "%ERRORLEVEL_%"

このテンポラリバッチは、本来実行すべきバッチファイル(t\batchtst.cmd)を呼び出した後、%TEMP%\nyagos-11428.tmp というファイルに

という内容を出力する。後は nyagos.exe でこれを読みだして反映するだけ!

多分、これで環境設定バッチバッチソだと思うんですが、どうでしょうか!

(正直、ひどい力業(ちからわざ)だとは思いますけどね)

この環境変数バッチを読み込む機能自体は、以前より source というコマンドに実装されていた。4.2.5βではそれに対し、以下のような修正を行った。

  • source と打たずとも、デフォルトのバッチファイル実行でも、反映機能が有効になるようにした。
  • %TEMP%\nyagos-(プロセスID).cmd生成の際、バッチへの引数が正しく引き渡されない以下の不具合を修正
    • UTF8 のまま引き渡され、CMD.EXE 側で正しく受け取れなかった(⇒ 現在のコードページ文字列(ANSI)へ変換)
    • "&"">" といった引数の二重引用符が外れてしまっていた(⇒ 元々の二重引用符をそのまま引き渡すように修正)

以上、開発の現場からでした。