【CMD】環境変数PATHの永続設定(CUI・GUI)

コマンドプロンプト

通常の環境変数とPATHの違い

環境変数の永続な設定にあたり、ユーザー環境変数とシステム環境変数が両方定義されている場合、通常はユーザー環境変数が優先されます。( ユーザー環境変数とシステム環境変数

しかし環境変数 PATH のみ、システム環境変数にユーザー環境変数が連結され、「システム環境変数の値 + ユーザー環境変数の値」が使用されます。( 環境変数PATH

User environment variables
ユーザー環境変数

User environment variables can be viewed from Control Panel as well. The user may add, delete or modify the environment variables in the User Environment Variables for User field. These variables take precedence over system environment variables. The user path is appended to the system path.
ユーザー環境変数はコントロールパネルからも確認できます。ユーザーは、ユーザーの「ユーザー環境変数」フィールドで、環境変数を追加、削除、または変更できます。これらの変数は、システム環境変数よりも優先されます。ユーザーPATHはシステムPATHに追加されます。

Environment variables in Windows NT > User environment variables
※ Wayback Machine

ユーザー環境変数とシステム環境変数が両方定義されている場合

  • 通常の環境変数:ユーザー環境変数の値が使用される
  • 環境変数 PATH:システム環境変数 PATH の値 + ユーザー環境変数 PATH の値

どういうことか確認してみます。設定画面を開き、通常の環境変数(例としてここではPATHEXT)と、環境変数 PATH が、どちらもユーザー環境変数とシステム環境変数の両方に定義されていたとします。この状態で set コマンドで環境変数の値を確認すると、PATHEXT はユーザー環境変数に設定された値が出力され、PATH はシステム環境変数にユーザー環境変数が連結された値が出力されます。

これが何を意味するかというと、環境変数PATHを参照する場合、コマンドプロンプト(set%PATH%)では、”システム環境変数のPATH” と “ユーザー環境変数のPATH” を区別できないということです。

環境変数PATHの永続設定(GUI)

例えば、PATH に別の環境変数 JAVADIR を追加したいとします。GUIで環境変数 PATH を編集する場合、以下の通りに行います。( 設定画面の開き方

  1. ユーザー環境変数の設定画面から「Path」を選択して[編集]を押下。
  2. 任意行を選択して[編集]、または[新規]を押下して値を入力。
  3. 変更内容を確定させるため[OK]を押下して閉じる。

環境変数の編集画面からも、PATH が他と異なる特殊なものであることが分かります。通常の環境変数は、変数名と変数値を任意に新規作成または編集でき、変数名と変数値は1対1の関係です。

一方、環境変数 PATH の値は、複数行が表示され、各行に対して編集や削除、または行の追加を行うことができます。また、環境変数 PATH; 区切りで設定される順番も重要な意味を持つため、優先順位の変更ができるように[上へ][下へ]ボタンも用意されています。

※厳密には、; 区切りの一行の文字列(これは編集画面右下[テキストの編集]から直接編集可能)であり、通常の変数と同様に変数名と変数値は1対1の関係です。編集画面上では分かりやすいように、複数行に分かれて表示されているだけです(この時各行末尾に;は不要)。

  • 通常の編集画面
    • 変数名 → 編集可能
    • 変数値 → 編集可能
  • Pathの編集画面
    • 変数名 → 固定「Path」
    • 変数値 → 複数行。個別に追加・編集が可能。順番も変更可能。

編集画面を[OK]で閉じた後、新しいコマンドプロンプトを開くと、追加(または編集)が PATH に反映されていることを確認できます。(区切り文字 ; は自動で追加されるため編集画面での入力は不要)

# 環境変数 PATH を出力する path コマンドで確認
# 末尾に JAVADIR(=C:\Users\xxx\java\jdk-23.0.1)が追加されている
$ path
Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;・・・;C:\Users\xxx\java\jdk-23.0.1\bin;

環境変数PATHの永続設定(setx)

次に、CUI(setxコマンド)で PATHJAVADIR を追加する方法を考えてみます。基本的な考え方は set コマンドと同じで、既存の値に追加したい値を連結したものを設定することで実現します。( set setx

つまり "%PATH%;%JAVADIR%\bin" を設定するということになります。(""で囲んでいるのは、PATHの値にスペースが含まれるためです。)この時、注意しなくてはならない点が2つあります。

注意点1: システム環境変数の重複

1つ目は、先述した通り、%PATH% で取得できるのが「”システム環境変数のPATH” の値 + “ユーザー環境変数のPATH” の値」であるということです。そのため setx コマンドで PATH に値を追加しようとすると、以下のようにシステム環境変数のPATHが重複して設定されるという挙動になってしまいます。

  1. %PATH% は、次の2つを連結した文字列を表す。
    • “システム環境変数のPATH” の値
    • “ユーザー環境変数のPATH” の値
  2. 従って $ setx PATH "%PATH%;%JAVADIR%\bin" の実行は、
    ユーザー環境変数 PATH、次の3つを連結した値を設定することを意味する。
    • “システム環境変数のPATH” の値
    • “ユーザー環境変数のPATH” の値
    • C:\Users\xxx\java\jdk-23.0.1\bin
  3. %PATH% は「システム環境変数 + ユーザー環境変数」になるため、
    次のように “システム環境変数のPATH” の値 が重複した状態になる。
    • システム環境変数 PATH
      • “システム環境変数のPATH” の値
    • ユーザー環境変数 PATH
      • “システム環境変数のPATH” の値
      • “ユーザー環境変数のPATH” の値
      • C:\Users\xxx\java\jdk-23.0.1\bin

注意点2: 参照元の変数値の固定化

2つ目の注意点は、PATH に別の環境変数の参照を含める場合、設定時に展開された値が文字列として固定されてしまうため、参照元の環境変数の変更が反映されないということです。

環境変数に別の変数の参照を含めるということについては以下も参考にしてください。

ここまでに示した PATH%JAVADIR% を追加する例の場合、GUI(設定画面)から行えば %JAVADIR%\bin のように参照が維持されたまま末尾に追加できますが、CUI(setx)を使用すると、展開された固定の文字列 C:\Users\xxx\java\jdk-23.0.1\bin が追加されてしまいます。

setxコマンドで PATH の末尾に %JAVADIR%\bin を追加する。

$ echo %JAVADIR%
C:\Users\xxx\java\jdk-23.0.1

$ echo %PATH%
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;・・・

$ setx PATH "%PATH%;%JAVADIR%\bin"

成功: 指定した値は保存されました。

setxコマンドで JAVADIR に設定されたパスを変更する。

$ echo %JAVADIR%
C:\Users\xxx\java\jdk-23.0.1

$ setx JAVADIR C:\Users\xxx\java\jdk-17.0.13

成功: 指定した値は保存されました。

JAVADIR の変更は PATH に反映されていない。

$ echo %JAVADIR%
C:\Users\xxx\java\jdk-17.0.13

$ echo %PATH%
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;・・・;C:\Users\xxx\java\jdk-23.0.1\bin

このことは以下でも言及されています。

既存の変数に対してこのコマンドを実行すると、変数の参照が削除されて、展開された値が使用されます。

たとえば、変数 %PATH% に %JAVADIR% への参照が含まれている場合、setx を使用して %PATH% を操作すると、%JAVADIR% が展開され、その値がターゲット変数 %PATH% に直接割り当てられます。 これは、%JAVADIR% に対するその後の更新が、%PATH% 変数に反映されないことを意味します。

setx > 解説

従って以上2点より、環境変数 PATH に永続的な設定を追加したい場合は、基本的に setx コマンドを使用せず、GUIで操作する方が良いと言えます。

環境変数PATHの永続設定(reg)

特に制約がない限り、PATH の永続設定はGUIで行うべきということはここまでに記載した通りです。しかし、それでもCUIで操作を行わなければならない状況である場合、setxコマンド の代わりに regコマンド を使用することで実現が可能です。

setx を使用する際の問題は、%PATH% が「システム環境変数 + ユーザー環境変数」となり、「”システム環境変数のPATH” の値」と「”ユーザー環境変数のPATH” の値」とを区別できない点にありました。一方、レジストリエディタで確認すると分かる通り、これらはそれぞれ別々のレジストリに格納されているため、reg を使用してここにアクセスすることで個別に操作が可能となります。

上記に対して、例えば reg queryPATH を参照してみると、「”システム環境変数のPATH” の値」と「”ユーザー環境変数のPATH” の値」をそれぞれ個別に取り出すことができます。

# ユーザー環境変数は「HKEY_CURRENT_USER\Environment」に格納されている
$ reg query HKEY_CURRENT_USER\Environment

HKEY_CURRENT_USER\Environment
    OneDrive    REG_EXPAND_SZ    C:\Users\xxx\OneDrive
    Path    REG_EXPAND_SZ    C:\Users\xxx\AppData\Local\Programs\・・・
    TEMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp
    TMP    REG_EXPAND_SZ    %USERPROFILE%\AppData\Local\Temp


# ユーザー環境変数の PATH のみ参照できる
$ reg query HKEY_CURRENT_USER\Environment /v Path

HKEY_CURRENT_USER\Environment
    Path    REG_EXPAND_SZ    C:\Users\xxx\AppData\Local\Programs\・・・
# システム環境変数は「HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment」に格納されている
# ※パスにスペースが含まれる場合は "" で囲む必要あり
$ reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
    ComSpec    REG_EXPAND_SZ    %SystemRoot%\system32\cmd.exe
    DriverData    REG_SZ    C:\Windows\System32\Drivers\DriverData
    NUMBER_OF_PROCESSORS    REG_SZ    12
    OS    REG_SZ    Windows_NT
    Path    REG_EXPAND_SZ    %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;・・・
    PATHEXT    REG_SZ    .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
    PROCESSOR_ARCHITECTURE    REG_SZ    ARM64
    PROCESSOR_IDENTIFIER    REG_SZ    ARMv8 (64-bit) Family 8 Model 1 Revision 201, Qualcomm Technologies Inc
    PROCESSOR_LEVEL    REG_SZ    1
    PROCESSOR_REVISION    REG_SZ    0201
    PSModulePath    REG_EXPAND_SZ    %ProgramFiles%\WindowsPowerShell\Modules;%SystemRoot%\system32\WindowsPowerShell\v1.0\Modules
    TEMP    REG_EXPAND_SZ    %SystemRoot%\TEMP
    TMP    REG_EXPAND_SZ    %SystemRoot%\TEMP
    USERNAME    REG_SZ    SYSTEM
    windir    REG_EXPAND_SZ    %SystemRoot%


# システム環境変数の PATH のみ参照できる
# ※パスにスペースが含まれる場合は "" で囲む必要あり
$ reg query "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v Path

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
    Path    REG_EXPAND_SZ    %SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;・・・

従って、例えば reg add で「”ユーザー環境変数のPATH” の値」のみを個別に書き換えれば、意図した通りに環境変数 PATH をCUIで操作できることが分かります。

環境変数PATHの永続設定の要点

環境変数PATHの永続設定

  • 基本はGUIで操作する。
  • 止むを得ずCUIで操作する場合は setx でなく reg を使用する。
タイトルとURLをコピーしました