search
LoginSignup
1

More than 3 years have passed since last update.

posted at

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

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

だが、しかし:

t\batchtst.cmd
set F=%TIME%
cd "%TEMP%"

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

%TEMP%\nyagos-11428.cmd
@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 というファイルに

  • 1行目:実行直後のカレントディレクトリ
  • 2行目以降:「環境変数名=値」の繰り返し

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

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

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

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

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

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

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
1