Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.
  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)へ変換)
    • "&"">" といった引数の二重引用符が外れてしまっていた(⇒ 元々の二重引用符をそのまま引き渡すように修正)

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away