用户变量和系统变量在windows中存储位置、生效范围及优先级不同:用户变量存于hkey_current_user\environment,仅当前用户可见且普通权限可修改;系统变量存于hkey_local_machine\system\currentcontrolset\control\session manager\environment,对所有用户生效但需管理员权限修改;同名时用户变量优先覆盖系统变量,但管理员进程不继承用户变量。

直接在命令行里看最清楚:用户变量和系统变量不仅存储位置不同,加载顺序和生效范围也不同。关键不是“能不能看到”,而是“看到的是谁的、从哪来的”。
一、用命令快速区分两者
打开 CMD 或 PowerShell,执行以下命令:
-
查用户变量:
set(显示全部变量)→ 找带HKEY_CURRENT_USER特征的,或手动过滤:reg query "HKCU\Environment" /s -
查系统变量:
reg query "HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /s -
对比同名变量优先级:比如都设了
PATH,运行echo %PATH%看到的是合并后结果;但实际查找顺序是:先搜系统 PATH 中的路径(从左到右),找不到再搜用户 PATH。
二、图形界面里一眼识别区别
进“环境变量”对话框(Win+R → sysdm.cpl → 高级 → 环境变量):
- 上半区叫“用户变量”,标题写着“zhangsan 的用户变量”(显示当前用户名)→ 只属于你
- 下半区叫“系统变量”,没用户名标识 → 所有账号都能用
- 如果同一个变量名(如
HOME)在两处都存在,CMD 中echo %HOME%显示的是用户变量的值(用户级优先覆盖)
三、验证哪个变量真正起作用
举个常见例子:你同时在用户变量和系统变量里设置了 M2_HOME,但值不同:
- 新开一个普通 CMD →
echo %M2_HOME%→ 显示用户变量的值 - 右键“以管理员身份运行”CMD →
echo %M2_HOME%→ 显示系统变量的值(管理员进程不继承用户变量) - IDEA 或 VS Code 启动时读取的是用户会话环境 → 一般用用户变量;而服务类程序(如 Jenkins Windows 服务)默认读系统变量
四、为什么不能只靠“echo %xxx%”判断来源
因为环境变量最终是合并呈现的:
-
%PATH%是系统 PATH + 用户 PATH 拼起来的(中间用分号连接) -
%JAVA_HOME%这类单值变量,用户级会覆盖系统级,但你不知道它来自哪边——得去注册表或环境变量窗口确认 - 某些程序(如 Git Bash、WSL)可能只加载用户环境,忽略系统变量;而批处理脚本默认全继承











