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 记得先读再拼。
