通常の環境変数と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
を編集する場合、以下の通りに行います。( 設定画面の開き方 )
- ユーザー環境変数の設定画面から「Path」を選択して[編集]を押下。
- 任意行を選択して[編集]、または[新規]を押下して値を入力。
- 変更内容を確定させるため[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
コマンド)で PATH
に JAVADIR
を追加する方法を考えてみます。基本的な考え方は set
コマンドと同じで、既存の値に追加したい値を連結したものを設定することで実現します。( set
・ setx
)
つまり "%PATH%;%JAVADIR%\bin"
を設定するということになります。(""
で囲んでいるのは、PATH
の値にスペースが含まれるためです。)この時、注意しなくてはならない点が2つあります。
注意点1: システム環境変数の重複
1つ目は、先述した通り、%PATH%
で取得できるのが「”システム環境変数のPATH
” の値 + “ユーザー環境変数のPATH
” の値」であるということです。そのため setx
コマンドで PATH
に値を追加しようとすると、以下のようにシステム環境変数のPATH
が重複して設定されるという挙動になってしまいます。
%PATH%
は、次の2つを連結した文字列を表す。- “システム環境変数の
PATH
” の値 - “ユーザー環境変数の
PATH
” の値
- “システム環境変数の
- 従って
$ setx PATH "%PATH%;%JAVADIR%\bin"
の実行は、
ユーザー環境変数PATH
に、次の3つを連結した値を設定することを意味する。- “システム環境変数の
PATH
” の値 - “ユーザー環境変数の
PATH
” の値 C:\Users\xxx\java\jdk-23.0.1\bin
- “システム環境変数の
%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% 変数に反映されないことを意味します。
従って以上2点より、環境変数 PATH
に永続的な設定を追加したい場合は、基本的に setx
コマンドを使用せず、GUIで操作する方が良いと言えます。
環境変数PATHの永続設定(reg)
特に制約がない限り、PATH
の永続設定はGUIで行うべきということはここまでに記載した通りです。しかし、それでもCUIで操作を行わなければならない状況である場合、setx
コマンド の代わりに reg
コマンド を使用することで実現が可能です。
setx
を使用する際の問題は、%PATH%
が「システム環境変数 + ユーザー環境変数」となり、「”システム環境変数のPATH
” の値」と「”ユーザー環境変数のPATH
” の値」とを区別できない点にありました。一方、レジストリエディタで確認すると分かる通り、これらはそれぞれ別々のレジストリに格納されているため、reg
を使用してここにアクセスすることで個別に操作が可能となります。

上記に対して、例えば reg query で PATH
を参照してみると、「”システム環境変数の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
を使用する。