PowerShell 设置环境变量:临时、当前用户、系统级

PowerShell 里改环境变量有三档:当前会话当前用户永久系统级永久,权限和作用范围各不相同。搞混了一堆脚本会失效。

临时(仅当前 PowerShell 窗口)

$env:MY_TOKEN = "secret"
echo $env:MY_TOKEN
  • 只影响当前会话
  • 关掉窗口就没了
  • 90% 的临时脚本调试用这个就够

对子进程也生效:

$env:PYTHONPATH = "D:\repo\src"
python main.py    # main.py 里能读到

永久(当前用户)

[System.Environment]::SetEnvironmentVariable("MY_TOKEN", "secret", "User")
  • 写到注册表 HKCU\Environment
  • 新开的进程能读到
  • 当前 PowerShell 窗口需要重开 才能通过 $env:MY_TOKEN 看到

不重开也想立刻用的话:

$env:MY_TOKEN = "secret"    # 先本地设一份

永久(系统级)

需要管理员 PowerShell:

[System.Environment]::SetEnvironmentVariable("MY_TOKEN", "secret", "Machine")
  • 写到 HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environment
  • 所有用户都能读到
  • 用于系统服务、多用户共享配置

读取和删除

读:

$env:MY_TOKEN
[System.Environment]::GetEnvironmentVariable("MY_TOKEN", "User")
[System.Environment]::GetEnvironmentVariable("MY_TOKEN", "Machine")

删(把值设为空字符串就是删除):

[System.Environment]::SetEnvironmentVariable("MY_TOKEN", $null, "User")

追加到 PATH

写 PATH 一定要先读旧的再拼,不然会把系统原本的 PATH 覆盖掉:

$old = [System.Environment]::GetEnvironmentVariable("Path", "User")
$new = "$old;C:\Users\me\bin"
[System.Environment]::SetEnvironmentVariable("Path", $new, "User")

去重和验证:

$new.Split(";") | Sort-Object -Unique

三档对比

目标写法生效范围
只当前窗口$env:X = "v"当前会话 + 子进程
当前用户永久[Environment]::SetEnvironmentVariable("X","v","User")新开进程,用户级
系统级永久(管理员)[Environment]::SetEnvironmentVariable("X","v","Machine")新开进程,所有用户

老 Windows API:setx

老一辈 Windows 用 setx

setx MY_TOKEN secret          # 用户
setx MY_TOKEN secret /M       # 系统(管理员)

坑:

  • 有 1024 字符限制,PATH 老长了会被截断
  • 也不影响当前窗口

一般还是推荐 [Environment]::SetEnvironmentVariable

一句话总结

会话内 $env:X;永久用 [Environment]::SetEnvironmentVariable,第三参数 "User""Machine" 决定作用域。改 PATH 记得先读再拼。