読者です 読者をやめる 読者になる 読者になる

3.環境変数 (5)起動時に有効になる環境変数 〜人生と環境変数は、順番が大事〜 【コマンドプロンプト、バッチファイルを使わなきゃならなくなった人向けのメモ】

Windows Command DOSBatch


Windows XP以降だと環境変数は、以下で設定できる。

setコマンドについては説明済み、
autoexec.batは、推奨しないので説明は省略。


システム環境変数とユーザ環境変数の違いについてざっくり説明する。

ユーザ環境変数は、サービスなどユーザがログインしてないくて
動作しているプロセスにも有効になる。
ユーザ環境変数は、ログインしてから起動するプロセスに対して有効になる。

では、同じ環境変数名で異なる値が設定されていたらどうなるか?

実験

設定値

以下を設定する

環境変数 システム環境変数の値 ユーザ環境変数の値
TEST_OVERWRITE SYSTEM USER
TEST_ADD %TEST_ADD%;SYSTEM %TEST_ADD%;USER
設定方法

コントロールパネル > パフォーマンスとメンテナンス > システム
もしくは
エクスプローラからマイコンピューターを右クリック > プロパティ

システムのプロパティから
「詳細設定」タブの環境変数を選択


結果

環境変数 サービス(*1)での値 アプリケーション(*2)での値
TEST_OVERWRITE SYSTEM USER
TEST_ADD SYSTEM SYSTEM;USER

*1 apache で Process Walkerで確認
*2 コマンドプロンプトでsetコマンドで確認

注意事項

起動したままのプロセスには有効にならない。
分かっているつもりでも結構以下ではまる。

サービス

サービスは、システム環境変数に変更して、サービスを再起動しても有効にならなず
OS起動時のシステム環境変数のままのものもある。
サービスは、サービスマネージャー(service.exe)から起動される。サービスマネージャーは
起動したままであり、OS起動時のシステム環境変数のままであるからである。
(サービスプログラムの中で起動環境変数を取得して、新たに設定して子プロセスを起動してれば問題ない)
サービスの環境変数は、いつのものが有効になっているかが分かりにくい。
TEMP、TMPなどは、システム環境変数とユーザ環境変数で値が異なる。
いつのどの環境変数が有効になっているかProcess Walker、Process Explorerなどのツールを
使って確認したほうがいいだろう。

クイック起動やランチャー

クイック起動やランチャーで起動すると、ユーザ環境変数を変更して、新しくアプリケーションを起動して有効にならず
ログインした時のユーザ環境変数のままである。
アプリケーションは、ランチャーから起動される。ランチャーは起動したままであり、ユーザログイン時
のユーザ環境変数のままであるから
クイック起動からコマンドプロンプトを起動して、環境変数が有効にならないんだけど・・・
なんて質問を結構された記憶がある。