在 Windows 上永久设置环境变量

把用户或系统级环境变量永久写入——讲清三种作用域($env:、User、Machine)以及 setx 会截断的老坑。

Windows环境变量开发PowerShell中风险
运行 `[Environment]::SetEnvironmentVariable('JAVA_HOME', '<路径>', 'User')` 持久保存变量;传 'Machine' 则对全系统生效。

01命令

命令
$ [Environment]::SetEnvironmentVariable('JAVA_HOME', 'C:\Program Files\Java\jdk-21', 'User')

02作用说明

`$env:JAVA_HOME = '...'` 只在当前 PowerShell 会话有效;SetEnvironmentVariable 指定 Target 后会写入注册表,之后所有新进程都会继承。有个刻意的特性:当前会话仍然看不到新值——如果脚本马上要用,请同时设置 `$env:JAVA_HOME`。CMD 里等价命令是 `setx JAVA_HOME "..."`,同样持久化,但会把超过 1024 字符的值静默截断——用这种方式改 PATH 是著名的翻车现场。

03风险

风险中风险
使用条件'Machine' scope requires an elevated prompt. Already-open terminals won't see the change until restarted.
!注意: 不要用 setx 或手工 SetEnvironmentVariable 整体覆盖 PATH——进程的 PATH 是用户与机器两部分的合并,直接覆盖曾毁掉无数人的 PATH。

04撤销

撤销
$ [Environment]::SetEnvironmentVariable('JAVA_HOME', $null, 'User')

05来源

  • Environment.SetEnvironmentVariable Method | Microsoft Learn
    Microsoft · vendor-doc · 2026-09-17
    依据: Microsoft documents SetEnvironmentVariable(name, value, EnvironmentVariableTarget) where Machine/User persist to the registry and passing null deletes the variable.
  • SETX - Windows CMD
    SS64 · technical · 2026-09-17
    依据: SS64 documents setx persisting environment variables to the registry for future sessions, without affecting the current one.

最后验证: 2026-09-17 · 分类: 开发者

06相关方案