在 Windows 中查看和设置环境变量的命令

概要

Windows 环境变量是通过进程启动时创建的环境块(environment block)进行引用的。本文将准确梳理环境变量的作用域(进程、用户、系统)、持久化机制、在 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(需管理员)

进程、用户、系统是不同层级

  • 进程环境变量:仅对当前 Shell / 进程有效
  • 用户环境变量:仅对当前用户有效
  • 系统环境变量:对所有用户有效
  • 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 长度受限,可能发生截断(不推荐用来修改 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 修改应优先使用 PowerShell + .NET API(见后文),不要用 setx 直接拼接。


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 类型(保留 %SystemRoot% 等占位符)
  • 修改过程更安全、可控

Step 8: 使用 .NET API 安全修改 PATH(强烈推荐)

$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 中“看见”的变量作用域可能不同(尤其是 PATH)。
  • 要准确区分用户与系统环境变量,应直接检查 HKCU/HKLM。
  • setx 虽能持久化,但对 PATH 风险较大,不推荐用于 PATH 操作。
  • 使用 .NET API(SetEnvironmentVariable)是最安全、最可控的做法。