環境変数の概要
環境変数とは、特定の環境の中で、実行される全てのプログラムが参照可能な変数のことです。

コマンドプロンプトを操作する文脈で環境変数という語句が出てきた場合は、そのコンピュータ(Windows OS)上で動くプログラムが参照できる変数のことです。

コマンドプロンプトでの環境変数の具体的な操作方法は次の通りです。実際に操作しながら確認すると、環境変数の概要をより理解しやすくなります。
環境変数の操作
以降、環境変数を操作するため主に set
コマンドを使用していきます。基本的に set
コマンドを使って環境変数を操作する際、カレントディレクトリがどこであるかは影響しません。そのため、コマンド実行例をいくつか記載していきますが、どこのディレクトリで実行しても問題ありません。
定義されている環境変数の確認
定義されている環境変数の一覧を確認するには、set
コマンドを使用します。出力結果の各行において、=
の左辺が環境変数名、右辺が変数に格納されている値です。
# 環境変数の一覧を表示
C:\Users\xxx>set
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\xxx\AppData\Roaming
CommonProgramFiles=C:\Program Files\Common Files
・・・中略・・・
USERNAME=xxx
USERPROFILE=C:\Users\xxx
windir=C:\Windows
set
コマンドに引数を渡すと、指定した文字列で始まる環境変数のみを出力します。(大文字・小文字は区別されません。)
#「P」で始まる環境変数の一覧を表示
C:\Users\xxx>set P
Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Windows\System32\OpenSSH\;C:\Program Files\Docker\Docker\resources\bin;C:\Program Files\nodejs\;C:\Users\xxx\AppData\Local\Programs\Python\Python313\Scripts\;C:\Users\xxx\AppData\Local\Programs\Python\Python313\;C:\Users\xxx\AppData\Local\Programs\Python\Launcher\;C:\Users\xxx\AppData\Local\Microsoft\WindowsApps;C:\Users\xxx\AppData\Local\Programs\Git\cmd;C:\Users\xxx\AppData\Roaming\npm;C:\Users\xxx\AppData\Local\Programs\Microsoft VS Code\bin;C:\Users\xxx\AppData\Local\Muse Hub\lib
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=ARM64
PROCESSOR_IDENTIFIER=ARMv8 (64-bit) Family 8 Model 1 Revision 201, Qualcomm Technologies Inc
PROCESSOR_LEVEL=1
PROCESSOR_REVISION=0201
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(Arm)=C:\Program Files (Arm)
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PROMPT=$P$G
PSModulePath=C:\Program Files\WindowsPowerShell\Modules;C:\Windows\system32\WindowsPowerShell\v1.0\Modules
PUBLIC=C:\Users\Public
#「PRO」で始まる環境変数の一覧を表示
C:\Users\xxx>set PRO
PROCESSOR_ARCHITECTURE=ARM64
PROCESSOR_IDENTIFIER=ARMv8 (64-bit) Family 8 Model 1 Revision 201, Qualcomm Technologies Inc
PROCESSOR_LEVEL=1
PROCESSOR_REVISION=0201
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(Arm)=C:\Program Files (Arm)
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PROMPT=$P$G
#「PROM」で始まる環境変数の一覧を表示
C:\Users\xxx>set PROM
PROMPT=$P$G
環境変数の確認
出力結果:<環境変数名>=<変数に格納されている値>
# 環境変数の一覧表示
$ set
# 指定した文字列に前方一致する環境変数の一覧表示
$ set <文字列>
環境変数の設定(値の変更・新規作成・削除)
環境変数の値の変更
既存の環境変数は、=
で値を代入することで変更できます。(=
の前後にスペースを入れないように注意してください。)
次の例では、ユーザからの入力待機中に表示される文字列を設定する環境変数 PROMPT
の値を変更しています。
PROMPT
の詳細はこちらで整理しています。# 環境変数 PROMPT を表示
C:\Users\xxx>set PROMPT
PROMPT=$P$G
# 環境変数 PROMPT の値を「$P$G」から「$G」に変更
C:\Users\xxx>set PROMPT=$G
# 環境変数 PROMPT を表示
>set PROMPT
PROMPT=$G
# 環境変数 PROMPT の値を「$G」から「$$$S」に変更
>set PROMPT=$$$S
# 環境変数 PROMPT を表示
$ set PROMPT
PROMPT=$$$S
ちなみに、ここで行った変更は、このコマンドプロンプト内(=環境)でのみ有効なものです。例えばこの場合、別で新規にコマンドプロンプトを起動すると、プロンプト表示はデフォルトのまま C:\Users\xxx>
となっています。そのため、OS環境内で全てのプログラムが参照する変数であるからと心配し過ぎることなく、確認のために set
コマンドで色々な値に変更して試してみても大丈夫です。
set
コマンドで操作した環境変数は、同じコマンドプロンプト内でのみ有効。
閉じてしまえば元に戻る。新しく開いたコマンドプロンプトには影響しない。
環境変数の新規作成
環境変数は新規作成することも可能です。構文は変更の時と同じで、定義したい変数名に =
で値を代入することで新規に環境変数を作成することができます。左辺に指定した変数名が既に存在していれば変更、存在しなければ新規作成、ということになります。
# 環境変数 MYDOMAIN が未作成の状態
$ set MYDOMAIN
環境変数 MYDOMAIN が定義されていません
# 環境変数 MYDOMAIN を新規作成
$ set MYDOMAIN=middevpath.com
# 環境変数 MYDOMAIN が作成されたことを確認
$ set MYDOMAIN
MYDOMAIN=middevpath.com
従って、次の例のように、変数の値を変更しようとしてタイプミスをすると、エラーにはならず、新しく環境変数が作成されるという挙動になります。
# PROMPT の値を「$$$S」から「--$G」に変更したい
$ set PROM
PROMPT=$$$S
# PROMPT を誤って PROMPR と入力
$ set PROMPR=--$G
# エラーにはならず環境変数 PROMPR が新規作成される
$ set PROM
PROMPR=--$G
PROMPT=$$$S
また、上述した値を変更する際は=
の前後にスペースを入れないという点についても同じ理由で、「先頭にスペースが入った値」が代入された「末尾にスペースが入った新しい変数」が新規作成されてしまうためです。
# PROMPT の値を「$$$S」から「--$G」に変更したい
$ set PROM
PROMPT=$$$S
# =の前後にスペースを入れて実行
$ set PROMPT = --$G
# 環境変数「PROMPT 」= 値「 --$G」が新規作成される
$ set PROM
PROMPT=$$$S
PROMPT = --$G
# 後述の「%<変数名>%」を使って確認すると分かりやすい
#「PROMPT」=「$$$S」
$ echo %PROMPT%
$$$S
#「PROMPT 」=「 --$G」
$ echo %PROMPT %
--$G
環境変数の削除
誤って作成してしまった場合など、環境変数を削除することも可能です。環境変数の後ろに=
のみを続ける(=空文字を設定する)ことで、値をクリアし、変数を削除できます。
# 環境変数 PROMPR を削除したい
$ set PROM
PROMPR=--$G
PROMPT=$$$S
# 空の値を設定しクリアする
$ set PROMPR=
# 空の値を設定した変数は表示されなくなる
$ set PROM
PROMPT=$$$S
# 定義が削除されたことを確認できる
$ set PROMPR
環境変数 PROMPR が定義されていません
表示のコマンドと削除のコマンドは少し似ているためやや注意が必要です。
#「set PATHEXT」→ PATHEXT に前方一致する環境変数を表示
$ set PATHEXT
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
#「set PATHEXT=」→ 誤って「=」を付けると削除になる
$ set PATHEXT=
# 環境変数の定義が削除され参照できない
$ set PATHEXT
環境変数 PATHEXT が定義されていません
ただ、既存の環境変数であれば間違って消してしまっても、先述の通り現在のコマンドプロンプト内でのみ削除された状態なので、一度コマンドプロンプトを閉じてやり直せば問題はありません。
環境変数の設定
# 環境変数の変更または新規作成
$ set <変数名>=<値>
# 環境変数の削除
$ set <変数名>=
環境変数の展開(値の参照・追加・置換)
set
コマンドによって環境変数の確認は出来ますが、<変数名>=<値>
という形式で出力されるためあくまで定義の確認にとどまり、変数を指定して値を参照するということは出来ません。
環境変数の値の参照
変数名を %
で囲み、%<変数名>%
とすることで、変数名を展開して格納された値を参照することができます。
# ディレクトリのパスを設定した環境変数を作成
$ set MYDIRECTORY=C:\Users\xxx\workspace\java\sample
# 環境変数 MYDIRECTORY の定義を確認
$ set MYDIRECTORY
MYDIRECTORY=C:\Users\xxx\workspace\java\sample
# カレントディレクトリは「C:\Users\xxx」
$ cd
C:\Users\xxx
# そのまま指定すると変数ではなく文字列として認識される
#「MYDIRECTORY」という名前のディレクトリは存在しないためエラー
$ cd MYDIRECTORY
指定されたパスが見つかりません。
# %で囲むと変数に設定された値を参照できる
$ cd %MYDIRECTORY%
#「C:\Users\xxx\workspace\java\sample」に移動できている
$ cd
C:\Users\xxx\workspace\java\sample
値だけを確認したい場合は、これを利用して set
でなく echo
を使用すると便利です。例えば「Path」と「PATHEXT」が存在する場合、set
の文字列指定は前方一致になるため「Path」のみを出力することが困難です。このように特定の環境変数の値を確認したい場合に有用です。
# <変数名>=<値> の形式で出力される
$ set PROMPT
PROMPT=$$$S
# <値>のみ出力される
$ echo %PROMPT%
$$$S
#「Path」と「PATHEXT」が両方出力されてしまう
$ set PATH
Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;・・・
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
#「Path」の値のみを出力できる
$ echo %PATH%
C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;・・・
※「Path」に限って言えば PATHコマンド の利用でより簡単に同じ出力を得られます。
PATH
の詳細はこちらで整理しています。環境変数の値の追加
値の変更ではなく追加をしたい場合にも %<変数名>%
の形式を利用することができます。set <変数名>=<値>
による値の変更では、上書きとなってしまい、追加することはできません。そのため、現在のものと追加したいものとを連結した値を設定することでこれを実現します。
#「.CMD;」を追加して「.COM;.EXE;.BAT;.CMD;」にしたい
$ set PATHEXT
PATHEXT=.COM;.EXE;.BAT;
#「.CMD;」をそのまま設定する
$ set PATHEXT=.CMD;
# 値が変更され既存の「.COM;.EXE;.BAT;」が消えてしまう
$ set PATHEXT
PATHEXT=.CMD;
#「.CMD;」を追加して「.COM;.EXE;.BAT;.CMD;」にしたい
$ set PATHEXT
PATHEXT=.COM;.EXE;.BAT;
# 右辺に「%<変数名>%<追加する値>」を指定する
#「%<変数名>%」= 既存の値 = .COM;.EXE;.BAT;
#「<追加する値>」 = .CMD;
$ set PATHEXT=%PATHEXT%.CMD;
# 既存の値を残しつつ新しい値を追加することが可能
$ set PATHEXT
PATHEXT=.COM;.EXE;.BAT;.CMD;
これは環境変数PATHにパスを追加する時によく利用されます。次の例ではさらに追加する値の側にも環境変数を使用しています。
# PATH に「C:\Users\xxx\java\jdk-17.0.12\bin」を追加したい
$ set PATH
Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem
# 追加したい値の一部も環境変数として定義されている
$ set JAVA_HOME
JAVA_HOME=C:\Users\xxx\java\jdk-17.0.12
# 区切り文字「;」や不足している「bin」ディレクトリを追加しつつ
#「%<変数名>%」で既存の値を参照しながら変更したい値を設定する
$ set PATH=%PATH%;%JAVA_HOME%\bin
# 環境変数 PATH に新しいパスを追加できる
$ set PATH
Path=C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Users\xxx\java\jdk-17.0.12\bin
%<変数名>%
の形式を利用した値の追加に関しては、上記に示した一時設定と 後述 する永続設定とで、参照元の変更が反映されるか否かが変わってきます。詳細は以下のページに別途まとめています。
環境変数の値の置換
上記の方法で環境変数に値を追加することが可能ですが、場合によっては特定の文字列を一部置換したり、一部削除したりしたいことがあります。
例えば一時的に異なるバージョンのコマンドにPATHを通したい場合、環境変数PATHは先頭から優先順位が高くなっているため、末尾にパスを追加しても変更が反映されないことになってしまいます。先頭に追加という方法もありますが、set <変数名>=%<変数名>:A=B%
とすることで、Aに一致する文字列をBに置換することが可能です。
# 一時的に「C:\java\jdk-17.0.13\bin」にPATHを通したい
$ set PATH
Path=C:\Windows\system32;C:\java\jdk-23.0.1\bin;C:\Program Files\nodejs\
#「C:\java\jdk-23.0.1\bin」を「C:\java\jdk-17.0.13\bin」に置換する
$ set PATH=%PATH:C:\java\jdk-23.0.1\bin=C:\java\jdk-17.0.13\bin%
#「C:\java\jdk-23.0.1\bin」が「C:\java\jdk-17.0.13\bin」に置き換わる
$ set PATH
Path=C:\Windows\system32;C:\java\jdk-17.0.13\bin;C:\Program Files\nodejs\
#「C:\java\jdk-17.0.13\bin;」を削除する
#「C:\java\jdk-17.0.13\bin;」を空文字に置換(=削除)
$ set PATH=%PATH:C:\java\jdk-23.0.1\bin;=%
#「C:\java\jdk-17.0.13\bin」が削除される
$ set PATH
Path=C:\Windows\system32;C:\Program Files\nodejs\
#「C:\java\jdk-23.0.1\bin」を先頭に挿入する
$ set PATH=C:\java\jdk-23.0.1\bin;%PATH%
# 末尾に追加ではなく先頭に挿入になる
$ set PATH
Path=C:\java\jdk-23.0.1\bin;C:\Windows\system32;C:\Program Files\nodejs\
環境変数の置換の構文については、set
のヘルプオプションでも確認することができます。
$ set /?
・・・略・・・
環境変数の置換は、次のように拡張されます:
%PATH:文字列 1 = 文字列 2%
は、PATH 環境変数を展開し、その結果に含まれるすべての "文字列 1" を
"文字列 2" に置き換えます。
・・・略・・・
環境変数の展開%<変数名>%
# 環境変数の値の参照(使用例)
$ echo %<変数名>%
$ cd %<変数名>%
# 環境変数の値の追加
$ set <変数名>=%<変数名>%<追加する値> # 末尾に追加
$ set <変数名>=<挿入する値>%<変数名>% # 先頭に挿入
# 環境変数の値の置換
$ set <変数名>=%<変数名>:<置換対象の文字列>=<置換後の文字列>% # 一部置換
$ set <変数名>=%<変数名>:<削除対象の文字列>=% # 一部削除(=空文字に置換)
環境変数の永続設定
ここまでに整理した set
コマンドは、先述の通り現在のコマンドプロンプト内(=環境)でのみ有効なものです。以降すべてのコマンドプロンプトで有効化したい場合は、環境変数を永続的に設定することが可能です。
具体的な操作方法については併せて以下を確認してください。