コマンドプロンプトで環境変数を操作する場合、set
コマンドを使用して行った変更はそのコマンドプロンプト内でのみ有効となります。しかし同じ設定を毎回行うのは大変なので、以降の全ての環境に対して変更を反映させたい場合もあります。ここでは環境変数を永続的に設定する方法を記載します。
set
コマンド」の詳細はこちらです。ユーザー環境変数・システム環境変数
まず、環境変数を永続的に設定する場合、「ユーザー環境変数」と「システム環境変数」の二つがある点を認識しておく必要があります。以下は環境変数の設定画面です。どちらか一方にのみ定義されている変数もあれば、両方に定義されている変数もあります。

ユーザー環境変数は、その変数を作成したユーザーのみが参照でき、システム環境変数は、すべてのユーザーが参照することができます。
環境変数には、ユーザー環境変数 (ユーザーごとに設定) とシステム環境変数 (すべてのユーザーに設定) の 2 種類があります。
ユーザー環境変数とシステム環境変数では、ユーザー環境変数の方が優先順位が高くなっています。そのため、ユーザー環境変数とシステム環境変数の両方に同名の変数が定義されている場合は、ユーザー環境変数の値が優先されます。
■ユーザー環境変数とシステム環境変数どちらにも PATHEXT
が定義されている場合

# ユーザー環境変数の値が優先される
$ set PATHEXT
PATHEXT=.PY
※別のユーザー(ユーザー環境変数 PATHEXT
を定義していない)で
PCにログインしている場合はシステム環境変数の値が使用される
# 別のユーザーでログインしている場合
$ set PATHEXT
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
■参考
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
システム環境変数は少なからず他のユーザーにも影響を及ぼすものであるため、特別な理由がない限りはユーザー環境変数を使用するのが良いと言えます。これ以降も、特に区別せず単に「環境変数」と記述している場合は、基本的に「ユーザー環境変数」を指しているものと考えてください。
ユーザー環境変数:変数を作成したユーザーアカウントのみ参照可能
システム環境変数:PC内のすべてのユーザーアカウントから参照可能
優先順位:①ユーザー環境変数 → ②システム環境変数
CUI(コマンドプロンプト)
まずはコマンドプロンプトで環境変数の永続設定を行う方法です。注意点として、ここで加えた変更は(元の値を覚えていないと)簡単には元に戻せません。そのため、いきなりこの永続設定を行うのではなく、変更後の設定が正しく動作するものであるか先に確認するため、コマンドプロンプトを閉じれば変更が破棄される set
コマンド を使用したり、あるいは現在の値をどこかにメモしておく等したりする方が安全です。
ユーザー環境変数の作成・変更(CUI)
環境変数を永続的に設定するには、set
コマンドの代わりに、setx
コマンドを使用します。=
を使わず、<変数名> <値>
とする点、構文が少しだけ異なりますが、set
コマンドと基本的な使用方法は同じです。既に定義されている変数名を指定した場合は変更、存在しない変数名を指定した場合は新規作成、となります。
- 通常設定:
set <変数名>=<値>
- 永続設定:
setx <変数名> <値>
set
コマンドと挙動が異なる点として注意が必要なのは、変更が反映されるタイミングです。set
では現在のコマンドプロンプト内でのみ変更が有効ですが、setx
では逆に現在のコマンドプロンプトでは変更が反映されず、変更後に新しく起動した全てのコマンドプロンプトで有効になります。
コマンド | 1. 元々起動していたコマンドプロンプト | 2. 現在のコマンドプロンプト | 3. 新しく起動したコマンドプロンプト |
---|---|---|---|
set | × 反映されない | ○ 反映される | × 反映されない |
setx | × 反映されない | × 反映されない | ○ 反映される |
以下は実際のコマンド例です。
① setx
コマンドでユーザー環境変数を新規作成
# 定義されていない状態
$ set USERVAR
環境変数 USERVAR が定義されていません
# オプションなしで setx を実行しユーザー環境変数を作成
$ setx USERVAR SampleEnvVar
成功: 指定した値は保存されました。
# 作成後も同じコマンドプロンプトでは参照できない
$ set USERVAR
環境変数 USERVAR が定義されていません
② setx
コマンド実行後に新しく別のコマンドプロンプトを起動
# 作成したユーザー環境変数を参照できる
$ set USERVAR
USERVAR=SampleEnvVar
※ 参照可能タイミングについては setx
のヘルプ( /?
オプション)にも記載あり
$ setx /?
~略~
注意: 1) ・・・
2) ローカル システム上では、このツールで作成または変更した
変数は、現在のコマンド ウィンドウでは利用できませんが、
その後のコマンド ウィンドウで利用できます。
3) ・・・
~略~
場合によって「エラー: 構文が無効です。既定のオプションは ‘2’ 回より多く使用することはできません。」というエラーが出力されることがあります。これは設定しようとしている値にスペースが含まれ、複数の引数として認識されてしまっていることが原因です。値を ""
で囲むことで、スペースを含む一つの文字列として指定することができます。
# 変数「GREETING」値「Hello World」を定義したい
# 値「Hello World」にスペースが含まれるためエラーになる
$ setx GREETING Hello World
エラー: 構文が無効です。既定のオプションは '2' 回より多く使用することはできません。
"SETX /?" と入力すると使用法が表示されます。
# 値を "" で囲むことで「Hello World」を一つの文字列と認識させる
$ setx GREETING "Hello World"
成功: 指定した値は保存されました。
上記の例のように文字列を直接設定する場合は分かりやすいのですが、後述 の %%
で別の変数の参照を含めるような場合、参照元の値にスペースが含まれているとエラー原因に気づきにくくなってしまうため注意が必要です。
# 変数「EXAMPLE」にはスペースを含む値が設定されている
$ set EXAMPLE
EXAMPLE=John Doe
# 変数「MYNAME」に「EXAMPLE」の値を設定したい
# 変数「EXAMPLE」の値にはスペースが含まれるため % で展開されてエラーになる
# 見た目上は構文に問題が無いように見えるため注意が必要
$ setx MYNAME %EXAMPLE%
エラー: 構文が無効です。既定のオプションは '2' 回より多く使用することはできません。
"SETX /?" と入力すると使用法が表示されます。
# この場合も "" で囲むことで % で展開した値を設定することが可能
# 新しいコマンドプロンプトで「MYNAME=John Doe」を確認できる
$ setx MYNAME "%EXAMPLE%"
成功: 指定した値は保存されました。
# 一部を "" で囲んでも値の全体にスペースが含まれる場合はエラーになる
$ setx GREETING Hello "%EXAMPLE%"
エラー: 構文が無効です。既定のオプションは '2' 回より多く使用することはできません。
"SETX /?" と入力すると使用法が表示されます。
# 全体を "" で囲むことで % で展開された変数の値を含め一つの文字列と認識させる
# 新しいコマンドプロンプトで「GREETING=Hello John Doe」を確認できる
$ setx GREETING "Hello %EXAMPLE%"
成功: 指定した値は保存されました。
システム環境変数の作成・変更(CUI)
上記の基本構文を使用した場合、デフォルトではユーザー環境変数として作成されます。システム環境変数として作成したい場合は /m
オプションを使用します。/m
オプションを使用する場合、コマンドプロンプトは「管理者として実行」する必要がある点に注意してください。
環境変数の永続設定(CUI)
※設定後に新しく開いたコマンドプロンプト以降で反映される
# ユーザー環境変数の永続設定
$ setx <変数名> <値>
# システム環境変数の永続設定
$ setx /m <変数名> <値>
GUI(設定 > 環境変数)
同じことをGUIでも設定可能です。こちらの方が直感的に操作できます。
ユーザー環境変数の作成・変更(GUI)
ユーザー環境変数の場合は、コントロールパネル > ユーザーアカウント > ユーザーアカウント > 環境変数の設定
から設定画面を開きます。この手順で開いた設定画面では、ユーザー環境変数のみ操作することが可能です。システム環境変数については、確認はできますが編集はできません。

見つからない場合はアプリ検索欄( + S )に「環境変数」と入力することで目的の画面へ到達できます。
「環境変数を編集」 → ユーザー環境変数のみ操作可。標準ユーザーでも開ける。
「システム環境変数の編集」→ システム環境変数共に操作可。管理ユーザーのみ開ける。
① コマンドプロンプトで環境変数が定義されていないことを確認。
# 環境変数 USERVAR は定義されていない
$ set USERVAR
環境変数 USERVAR が定義されていません
② 設定画面からユーザー環境変数の新規作成を行う。

③ 元々①で開いていたコマンドプロンプトからは参照できない。
# ①と同じコマンドプロンプトでは設定後も参照できない
$ set USERVAR
環境変数 USERVAR が定義されていません
④ 設定画面から新規作成した後に新しく開いたコマンドプロンプトからは参照できる。
# ②の設定後に開いたコマンドプロンプトでは新規作成した環境変数を参照できる
$ set USERVAR
USERVAR=SampleEnvVar
システム環境変数の作成・変更(GUI)
コントロールパネルのユーザーアカウント欄から設定画面を開くと、ボタンがグレーアウトされているため、ユーザー環境変数しか操作することができません。システム環境変数を操作したい場合は、コントロールパネル > システムとセキュリティ > システム > システムの詳細設定 > 環境変数
または 設定 > システム > バージョン情報 > システムの詳細設定 > 環境変数
から、システム環境変数も操作可能な設定画面を開くことができます。
システムとセキュリティ > システム > システムの詳細設定 > 環境変数
または 設定 > システム > バージョン情報 > システムの詳細設定 > 環境変数
(コントロールパネル > システムとセキュリティ > システム
をクリックすると、
設定 > システム > バージョン情報
が開かれるため、以降の手順は同じになる。)

この手順で開いた設定画面は、ユーザー環境変数とシステム環境変数の両方を操作可能ですが、「システムの詳細設定」を開くためには、管理者アカウントでログインしている必要があります。
環境変数の永続設定(GUI)
※設定後に新しく開いたコマンドプロンプト以降で反映される
■ユーザー環境変数(標準アカウントでも開ける)コントロールパネル > ユーザーアカウント > ユーザーアカウント > 環境変数の設定
■ユーザー環境変数とシステム環境変数(管理者アカウントでのみ開ける)コントロールパネル > システムとセキュリティ > システム > システムの詳細設定 > 環境変数
または設定 > システム > バージョン情報 > システムの詳細設定 > 環境変数
■ユーザー環境変数とシステム環境変数(アプリ検索から遷移)
アプリ検索欄( + S )に「環境変数」と入力。
「環境変数を編集」 → ユーザー環境変数のみ操作可。標準ユーザーでも開ける。
「システム環境変数の編集」→ システム環境変数共に操作可。管理ユーザーのみ開ける。
別の環境変数への参照を含む値の設定
永続設定の利点としてもう一つ、次の例に示すように、設定する値に別の環境変数の参照を含めることができる、という点が挙げられます。
① EXAMPLE
を含めて GREETING
を定義する。
$ set EXAMPLE
EXAMPLE=John Doe
$ setx GREETING "Hello %EXAMPLE%"
成功: 指定した値は保存されました。
② GREETING
は「Hello John Doe」となる。
$ set GREETING
GREETING=Hello John Doe
③ EXAMPLE
を「Jane Doe」に変更する。
$ setx EXAMPLE "Jane Doe"
成功: 指定した値は保存されました。
④ GREETING
は「Hello Jane Doe」となる。
$ set GREETING
GREETING=Hello Jane Doe
%<変数>%
とすることで、別の変数の値を利用できる点は、set
コマンドによる一時設定も同様です。しかし一時設定の場合、設定時点で変数が展開され固定の文字列となってしまいます。対して永続設定の場合、別の変数への参照を維持して設定ができるため、設定後も参照元の変数の変更が反映されるという点において有用です。
例えば、java
のパスを通したい場合、環境変数 PATH
に直接パスを追加するのでなく、java
のパスを設定した JAVA_HOME
を追加するようにします。こうすることで、java
のバージョンを変更したくなった時に、環境変数 PATH
の設定に触れることなく、JAVA_HOME
を変更すれば良くなります。
※上記の例で環境変数 PATH
を挙げましたが、PATH
に参照を含める場合、設定方法(CUI or GUI)によっても挙動が変わってしまうため、さらに注意が必要です。詳細は以下のページを確認してください。基本的にGUI(設定画面)から設定すれば問題はありません。
PATH
に別の参照を含む場合はさらに注意が必要です。※GUI(設定画面)から行えば問題なしCUIで操作する場合の注意点
setxによる環境変数の削除
環境変数の永続的な新規作成や変更を行う場合、CUIとGUIの手順どちらを使用しても、同じ挙動になるため問題はありません。しかし削除を行う場合に関しては、CUIの手順で setx
コマンドを使用することには注意が必要です。
例えば set
コマンドでは、値に空文字を設定することで環境変数の削除を実現します( setによる削除の例 )。これは setx
コマンドも同様です。
# setの場合: 空文字を設定することで環境変数を削除する
$ set <変数名>=
# setxの場合: 空文字を設定することで環境変数を削除する
$ setx <変数名> ""
しかしこの方法を利用した場合、コマンドプロンプト上では削除されていることを確認できるのですが、設定画面から確認すると、空文字が設定された定義が残ってしまうことが分かります。このため、環境変数の削除についてはGUIの手順で実施するほうが確実と言えます。
実際の例を確認する方が、どのような挙動になるか分かりやすいと思います。
① 環境変数 USERVAR
が定義されている。

② setx
コマンドで環境変数を削除する。
# 環境変数 USERVAR が定義されていることを確認
$ set USERVAR
USERVAR=SampleEnvVar
# setxで環境変数に空文字を設定(=削除)
$ setx USERVAR ""
成功: 指定した値は保存されました。
# 同じコマンドプロンプト内で変更は反映されない
$ set USERVAR
USERVAR=SampleEnvVar
③ 新しいコマンドプロンプトを開き、削除できていることを確認する。
# 新しく開いたコマンドプロンプトでは USERVAR を参照できず
# setxによって環境変数が削除されていることを確認できる
$ set USERVAR
環境変数 USERVAR が定義されていません
④ GUIで確認すると、削除したはずの環境変数の定義が残っている。(値は空文字)

⑤ GUIでも削除の操作を実施する必要がある。

以下の記述がこの挙動を指しているものと思われます。
このコマンドを使って、ローカルまたはシステム環境に追加された値を削除することはできません。 変数名を指定し、値を指定しないでこのコマンドを使用すると、ローカル環境から対応する値を削除できます。
setxによる環境変数PATHの変更
ユーザー環境変数とシステム環境変数が両方定義されている場合、ユーザー環境変数が優先されることは前述した通りです。しかし、環境変数 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
の値
この特性により、setx
コマンドを使って環境変数 PATH
を変更すると、通常の環境変数とは異なる変わり方になり、意図した通りに変更することができません。詳細は以下で整理していますが、このため環境変数 PATH
の変更については、GUIの手順で実施するほうが賢明です。
setx
で環境変数 PATH
の永続設定を行う場合の注意点はこちらで整理しています。