Windowsを始め、Unixの影響を受けているOSが持つ機能に環境変数がある。環境変数は、実行するプログラムに対してなんらかの情報/パラメーターを与える方法。1979年に作られたVersion 7 Unixに搭載され、Unixの基本的な機能の1つとして今でも使われている。
プログラムに対して情報やなんらかのパラメーターを与える方法にはコマンドラインがあるが、環境変数は事前に定義しておくもので、複数回実行されるプログラムに常に同じ情報/パラメーターを指定する。あるいは、デフォルト値のように常に情報/パラメーターを指定するといった使い方をすることが多い。
典型的なUnix系のコンソールアプリケーションでは、コマンドラインのオプション指定の一部を環境変数から受け取ることができるものが多い。
Windowsでも、cmd.exeの組み込みコマンドである「dir」は、「DIRCMD」という環境変数からコマンドラインと同じオプション指定を受け取ることができる。これを使うと、起動時にオプションをすべて省略したときの動作を環境変数に指定しておくことができる。
たとえば、以下のコマンドを実行すると、名前の逆順にファイルのリストを出力する。
set DIRCMD=/O-N
dir
詳細は、“dir /?”で表示されるオンラインヘルプを参照してほしい。
環境変数はシェルでも頻繁に使われる。以下の表にシェルごとのプロセス環境変数の使い方を示す。
Windowsにおける環境変数の仕組み
Windowsの環境変数は大きく3つの種類がある。「システム環境変数」「ユーザー環境変数」「プロセス環境変数」だ。システム環境変数はマシン内のすべてのユーザーに共通の環境変数、ユーザー環境変数はユーザーごとの環境変数だ。この2つはレジストリに記録されており、起動時に合成されて「プロセス環境変数」になる。このときの合成では、ユーザー環境変数の値が優先され、同名の環境変数があれば、ユーザー環境変数の値が使われる(例外あり)。
すべてのプロセス(UWPアプリを除く)は、プロセス環境変数を親プロセスから受け継ぐ。親プロセスが環境変数を変更しなければ、それは、システム/ユーザー環境変数を合成したものがそのまま使われる。
コマンドプロンプトやPowerShellなどの「シェル」プログラムには環境変数を表示・変更する機能がある。こうしたプログラムでは環境変数を変更したのち、子プロセスとしてプログラムを起動できる。このプログラムは、シェルで変更された環境変数を受け継ぐ。
シェルで環境変数を書き換え、プログラムを実行したとき、プログラムは書き換えられた環境変数を参照することになる。ただし、環境変数を使うかどうかはプログラム次第である。前述のDIRのように環境変数を使うプログラムもあれば、そうでないプログラムもある。参照する環境変数名もプログラムにより異なる。
環境変数は、「環境変数名」と「値」から構成される。どちらも文字列で、環境変数名はアルファベットと数字および一部の記号(コマンドラインで意味を持つ記号を除く)が利用できる。基本的にはファイル名と同じと考えてかまわない。ただし「=」は環境変数名に使うことはできない。
1つの環境変数のサイズは64KB以内という制限があるが、実際には、設定するシェルなどの制限(たとえば1行の長さの最大値など)を受ける。
プロセス環境変数は、「環境変数ブロック」と呼ばれるメモリ内の領域に記録される。過去のWindowsでは、この環境変数ブロックの大きさに制限があったが、Windows 10/11ではその制限はない。
環境変数ブロックは、親プロセスの環境変数ブロックのコピーである。ただし、プロセスが終了すると環境変数ブロックは廃棄されてしまう。子プロセスから親プロセスに対して環境変数を使ってなにか情報を伝達することはできない。環境変数による情報の伝達は、常に親から子プロセスへの一方通行である。
また、環境変数ブロックは、プロセスの起動時に親から受け取るため、起動後の「システム/ユーザー環境変数」の変更を受け取ることはできない。原則として環境変数は起動時点のままとなる。
このため、CMD.EXEなどでは、システム/ユーザー環境変数が更新されたらプロセスを終了し、新規に起動する必要がある。注意する必要があるのは、Windows Terminalのように複数のシェルを起動可能な端末ソフトウェアを使う場合だ。Windows Terminalで実行されるCMD.EXEは、親がWindows Terminalとなるため、新規にCMD.EXEを起動しても、受け取るプロセス環境変数は同じものになる。これは、Windows Terminalが起動時に受け取ったプロセス環境変数がそのまま使われるからだ。

この連載の記事
-
第508回
PC
Scalable Vector Graphics(SVG)そもそも何なのか? -
第507回
PC
Windows 11の「開発者モード」とは何か? -
第506回
PC
Windows 11は早くも来秋登場の26H2プレビューの準備が始まる -
第505回
PC
結構変化しているWindows 11のエクスプローラーの基本設定を見直す -
第504回
PC
新しいOutlookとOutlook Classic、そろそろ古いOutlookとExchangeの組み合わせは引退の頃合いか -
第503回
PC
機能が増えたこともあり、寄せ集めから統合化に進むWindowsの便利ツール「PowerToys」 -
第502回
PC
Windows 11でBluetoothのオーディオ新規格「Bluetooth LE Audio」を試す -
第501回
PC
Windows 11 Ver.25H2での変更点、新機能を整理する -
第500回
PC
Windows 11 Ver.25H2が完成した -
第499回
PC
Windowsでの致命的だが回復可能なエラーに備える手段を2つ紹介 -
第498回
PC
Windows Terminalの安定版V1.23が公開 設定UIが改良される - この連載の一覧へ













