2026年1月11日日曜日

環境変数って何?一体どこで定義されているのか

 そもそも環境変数ってなに?

環境変数は超簡単に言えばただの「良く使うpath(パス)の集まり」です。
パスはエクスプローラーを開いた時に表示される「C:\Users\Username\Desktop\」みたいなPC上の階層の事です。
よく使うパスを登録した集合体の事を「環境変数」と呼んでいます。
PC内の処理で常にこういった長いパスを常に書き込んでいたらデータが長くなるので先に登録しておいて短い名称で呼び出そうという事です。

例えばよく使うアプリなどをデスクトップにショートカットを作ると思います。あれと同じです。ああいう感じのショートカットが1つに纏まってるという事です。

プログラミングなどのセットアップ時の環境変数

環境変数とだけ言うとつまりはただの省略パスの事なのでWindowsの特殊パス(マイドキュメントやデスクトップ)なども含まれますが一般的には「実行パス」の事を指します。
パスを通す」などともよく言われます。

実行パスを通すと登録したexeを名前だけで実行出来ます。
例えばWin+Rでファイル名を指定で実行読んでcmdやnotepadでアプリが呼び出せるのは環境変数が登録済みでパスが通っているからです。
逆にcmdやnotepadはOSに統合されたプログラムではなく単にcmd.exeやnotepad.exeが独立して作られておりそれを実行してるに過ぎません。

環境変数の確認の仕方

一般的なパスを確認するだけならWindowsの左下の検索バーで環境変数と入れれば簡単に確認できます。

※ただし、ここにはファイルを実行する系のパスは表示されません。

コマンドラインを開いて「path」を実行すればパスを表示できます。

ただこれだとちょっと見ずらいですよね。Powershellでも同様に表示し整形も出来ます。
まずは同じ事ができる「$env:Path」を実行してみましょう。

同じパスが表示されます。

次に整形して表示「$env:Path -split ";"」セミコロンで区切られるのでそこで改行させます

はい。分かりやすくなりましたね。

これらは一体どこに情報が書き込まれているのか?

次に情報の実体が一体どこにあるのかです。
答えから言うとレジストリにバイナリ形式で保存されています。
その為、メモ帳で開いてぱぱっと更新すると言ったことは出来ません。
バイナリエディタで開くにしてもチェックサムがある為「技術的には可能だが現実的ではない」です。

詰まる所、$envが何処にあるのかですよね。パワーシェルで「Get-PSDrive Env」を叩きます。

Environmentにある事がわかります。これがレジストリのどこにあるか。まずはレジストリエディタを開きましょう。
win+Rから指定実行で「regedit」

ルート名 役割(中身) ユーザーへの説明例
HKEY_CLASSES_ROOT (HKCR)ファイルの関連付けやプログラムの情報「拡張子(.txtなど)をどのアプリで開くか」を決める場所
HKEY_CURRENT_USER (HKCU)現在ログインしているユーザーの設定「壁紙」や「自分専用の環境変数」が入っている場所
HKEY_LOCAL_MACHINE (HKLM)PC全体(全ユーザー共通)の設定「システム環境変数」の本当の住所はここです
HKEY_USERS (HKU)PCに登録されている全ユーザーの個別情報「全社員の名簿とそれぞれの設定」を保管している大元の場所
HKEY_CURRENT_CONFIG (HKCC)現在のハードウェア構成の情報「今使っているモニターやプリンタ」の起動用設定

パスを通す場合は全体で呼べるようにするので「HKEY_LOCAL_MACHINE\」の中です。

コンピューター\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment

最終的にはここに書き込まれています。

階層レベル フォルダ名 (キー) 具体的に何が入っているか
第1階層HKEY_LOCAL_MACHINE全ユーザー共通のハードウェア設定やOSの基本情報。
第2階層SYSTEMWindowsの起動や動作に絶対必要な「核」となるデータ。
第3階層CurrentControlSet今まさに正常に動いているドライバーやサービスの設定セット。
第4階層Controlタイムゾーン、マウス、キーボード、ファイルシステムなどの挙動設定。
第5階層Session ManagerOS起動時のプログラム実行順序や、メモリ管理などの「下準備」データ。
第6階層Environment【最終目的地】 Pathなどの「共通のショートカット集」の実体。

階層はこの様になっています。
環境変数と言った場合、基本的にはここに記述されているデータが本体といって差し支えないです。

更に奥にある実体パス

ただし、実体をここまで見に行くと今までみたcmdの「path」やPowershellの「$env:Path」とも違う記述があります。
例えば「%SystemRoot%」などさらに変数で指定されている事が分かります。じゃあ今度はこれらは一体どこに格納されているのか

コンピューター\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion

この階層です。Windowsのより心臓部で定義されています。
ここで注目すべきなのはデータの種類(型)です。

実は先ほどのパスの種類は「REG_EXPAND_SZ」であり、今回の種類は「REG_SZ」です。
この違いが何かというと中の変数を展開できるかどうかです。

型の名前 正式名称 特徴・役割 環境変数での使われ方
REG_SZ String Value 固定された文字列。書かれた内容をそのまま読み取ります。 単純なパス(例: C:¥Tools¥App)
REG_EXPAND_SZ Expandable String 展開可能な文字列。中に % で囲まれた変数を含むことができる。 今回のキモ!%SystemRoot%等を翻訳するパス
REG_BINARY Binary Data バイナリ形式。人間には読めない形式。 特殊な構成情報の保存用など

つまり、今度こそ本当に環境変数という情報の末端という事です。
これで環境変数が一体なんなのかと、その実体が何処にあり参照されているか理解できたと思います。

0 件のコメント:

コメントを投稿