Windows環境変数の参照と設定コマンド

  1. 概要
  2. 変数表記について
  3. Step 1: 環境変数のスコープと保存場所
    1. プロセス・ユーザー・システムは別物
  4. Step 2: CMD(%VAR%)での環境変数参照と設定
    1. 2-1. プロセス環境変数を一覧表示
    2. 2-2. プロセス環境変数を参照
    3. 2-3. プロセス環境変数を一時的に設定(現在のCMD限定)
    4. 2-4. 永続的に設定(setx)
      1. 基本構文
      2. ユーザースコープ(既定)
      3. システムスコープ(/M 必須・管理者)
  5. Step 3: CMDでユーザー・システム環境変数を確認する方法
    1. ユーザー環境変数(HKCU)
    2. システム環境変数(HKLM)
  6. Step 4: PATH の安全な編集(CMDを使う場合の注意)
  7. Step 5: PowerShell($env:VAR)での環境変数参照と設定
    1. 5-1. プロセス環境変数を一覧表示
    2. 5-2. プロセス環境変数を参照
    3. 5-3. プロセス環境変数を一時的に設定
  8. Step 6: PowerShellでユーザー・システム環境変数を見る方法(最も正確)
    1. ユーザー環境変数(HKCU)
    2. システム環境変数(HKLM)
  9. Step 7: PowerShellで永続的に設定(.NET API / 推奨)
    1. ユーザースコープ(User)
    2. システムスコープ(Machine・管理者)
  10. Step 8: PATH 変数を安全に編集する(.NET API / 最推奨)
  11. Step 9: 環境変数の削除
    1. 9-1. プロセス(現在のPowerShellのみ削除)
    2. 9-2. 永続削除(レジストリ削除)
      1. ユーザー
      2. システム(管理者)
  12. Step 10: 設定の反映と確認
    1. 10-1. プロセス値を確認
    2. 10-2. CMD で確認
    3. 10-3. 永続値を現在のPowerShellに即時読み込み
  13. Step 11: 複数環境変数を一括設定(ユーザー・システム)
  14. まとめ

概要

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) が最も安全で確実。