- 概要
- 变量记法说明
- 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: 使用 .NET API 安全修改 PATH(强烈推荐)
- Step 9: 删除环境变量
- Step 10: 应用并验证设置
- Step 11: 批量设置多条环境变量(用户/系统)
- 总结
概要
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)是最安全、最可控的做法。
