- 概要
- 変数表記について
- Step 1: 環境変数のスコープと保存場所
- Step 2: CMD(%VAR%)での環境変数参照と設定
- Step 3: CMDでユーザー・システム環境変数を確認する方法
- Step 4: PATH の安全な編集(CMDを使う場合の注意)
- Step 5: PowerShell($env:VAR)での環境変数参照と設定
- Step 6: PowerShellでユーザー・システム環境変数を見る方法(最も正確)
- Step 7: PowerShellで永続的に設定(.NET API / 推奨)
- Step 8: PATH 変数を安全に編集する(.NET API / 最推奨)
- Step 9: 環境変数の削除
- Step 10: 設定の反映と確認
- Step 11: 複数環境変数を一括設定(ユーザー・システム)
- まとめ
概要
Windows環境変数は、プロセス起動時に作成される環境ブロックにより参照されます。本記事では、環境変数のスコープ(プロセス・ユーザー・システム)、永続化の仕組み、CMDとPowerShellでの参照・設定方法、そして「ユーザーとシステム環境変数がどう違い、どう見えるのか」を正確に整理します。
変数表記について
| 変数名 | 設定例 | 説明 |
|---|---|---|
<<VAR_NAME>> |
PATH |
操作対象の環境変数名 |
<<VALUE>> |
C:\Tools |
設定値 |
Step 1: 環境変数のスコープと保存場所
| 種類 | 保存場所 | 対象範囲 | 永続性 | 備考 |
|---|---|---|---|---|
| プロセス環境変数 | メモリ | 現在のプロセスのみ | 一時 | CMD: set / PowerShell: $env: |
| ユーザー環境変数 | HKCU\Environment |
現在のユーザー | 永続 | setx / .NET API |
| システム環境変数(Machine) | HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment |
全ユーザー | 永続 | setx /M / .NET API(管理者) |
プロセス・ユーザー・システムは別物
- プロセス環境変数:今のシェルだけ
- ユーザー環境変数:ユーザー固有
- システム環境変数:全ユーザー共通
- PATH は「システムPATH+ユーザーPATH」が結合されて見える場合がある
後述するように「見る場所が違う」ため、意図したスコープを確認してから設定する必要があります。
Step 2: CMD(%VAR%)での環境変数参照と設定
2-1. プロセス環境変数を一覧表示
set
2-2. プロセス環境変数を参照
echo %<<VAR_NAME>>%
2-3. プロセス環境変数を一時的に設定(現在のCMD限定)
set <<VAR_NAME>>=<<VALUE>>
2-4. 永続的に設定(setx)
基本構文
setx <<VAR_NAME>> "<<VALUE>>"
ユーザースコープ(既定)
setx <<VAR_NAME>> "<<VALUE>>"
システムスコープ(/M 必須・管理者)
setx <<VAR_NAME>> "<<VALUE>>" /M
setx の特徴
- 現在のCMDには反映されない
%PATH%を含む値はその場で展開され固定化される- PATH の長さ制限により切り捨てが起こりうる(非推奨)
Step 3: CMDでユーザー・システム環境変数を確認する方法
ユーザー環境変数(HKCU)
reg query HKCU\Environment
システム環境変数(HKLM)
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
※ reg query を使うと スコープごとの生の値 を確認できるため、PATHの結合有無や変数上書きの状況が正しく把握できる。
Step 4: PATH の安全な編集(CMDを使う場合の注意)
以下は危険な操作であり推奨しません。
# setx PATH "%PATH%;C:\Tools"
理由:
%PATH%が展開されて固定保存される- REG_EXPAND_SZ→REG_SZに変換され、
%SystemRoot%が失われる可能性 - PATH が長いと切り捨てられる
PATH編集は .NET API を用いるPowerShell を使います(後述)。
Step 5: PowerShell($env:VAR)での環境変数参照と設定
5-1. プロセス環境変数を一覧表示
Get-ChildItem Env:
5-2. プロセス環境変数を参照
$env:<<VAR_NAME>>
5-3. プロセス環境変数を一時的に設定
$env:<<VAR_NAME>> = "<<VALUE>>"
Step 6: PowerShellでユーザー・システム環境変数を見る方法(最も正確)
ユーザー環境変数(HKCU)
Get-ItemProperty "HKCU:\Environment"
システム環境変数(HKLM)
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment"
Step 7: PowerShellで永続的に設定(.NET API / 推奨)
ユーザースコープ(User)
[System.Environment]::SetEnvironmentVariable("<<VAR_NAME>>","<<VALUE>>","User")
システムスコープ(Machine・管理者)
[System.Environment]::SetEnvironmentVariable("<<VAR_NAME>>","<<VALUE>>","Machine")
この方式は
- PATHの切り捨てを防ぐ
- REG_EXPAND_SZを保持
- 値が安全に編集できる
といった利点がある。
Step 8: PATH 変数を安全に編集する(.NET API / 最推奨)
$add = "C:\Tools"
$current = [System.Environment]::GetEnvironmentVariable("PATH","Machine")
$new = ($current.TrimEnd(';') + ';' + $add).Trim(';')
[System.Environment]::SetEnvironmentVariable("PATH",$new,"Machine")
Step 9: 環境変数の削除
9-1. プロセス(現在のPowerShellのみ削除)
Remove-Item Env:<<VAR_NAME>> -ErrorAction SilentlyContinue
9-2. 永続削除(レジストリ削除)
ユーザー
Remove-ItemProperty -Path "HKCU:\Environment" -Name "<<VAR_NAME>>" -ErrorAction SilentlyContinue
システム(管理者)
Remove-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" -Name "<<VAR_NAME>>" -ErrorAction SilentlyContinue
Step 10: 設定の反映と確認
10-1. プロセス値を確認
Get-ChildItem Env:<<VAR_NAME>>
10-2. CMD で確認
echo %<<VAR_NAME>>%
10-3. 永続値を現在のPowerShellに即時読み込み
$env:<<VAR_NAME>> = [System.Environment]::GetEnvironmentVariable("<<VAR_NAME>>","User")
Step 11: 複数環境変数を一括設定(ユーザー・システム)
# ユーザー環境
$vars = @{
"APPDATA_DIR" = "C:\AppData"
"LOG_PATH" = "C:\Logs"
"TOOLS" = "C:\Tools"
}
foreach ($v in $vars.GetEnumerator()) {
[System.Environment]::SetEnvironmentVariable($v.Key,$v.Value,"User")
}
# システム環境(管理者)
$sysVars = @{
"JAVA_HOME" = "C:\Program Files\Java\<<VALUE>>"
}
foreach ($v in $sysVars.GetEnumerator()) {
[System.Environment]::SetEnvironmentVariable($v.Key,$v.Value,"Machine")
}
まとめ
- プロセス/ユーザー/システム環境変数は別々に存在する。
- CMD と PowerShell で「どのスコープが見えているか」が異なる。
- ユーザーとシステム環境変数を直接見るには HKCU/HKLM を確認する。
- setx は永続化できるが欠点が多く、PATH には非推奨。
- .NET API (
SetEnvironmentVariable) が最も安全で確実。
