关于本文
本文是通过利用生成式 AI 的自动化生成流程创建的。我们整理了 .NET 的 Environment API 与 Windows 环境变量的思路,并将其设计为仅通过不破坏现有值的虚拟变量来观察 Process/User 区别的步骤。
验证状态:📘 已确认官方信息 · Windows 实机未确认
在 PowerShell 中设置的 $env:PAPANDA_DEMO = 'A' 在新打开的 PowerShell 中消失并不是什么稀奇的事。仅适用于当前 Process 的环境变量与作为 User/Machine 保存的环境变量,其作用域是不同的。
我们来通过 在控制台中修改 → 在 Windows 的环境变量 GUI 中核对答案 这一流程来体验这种区别。
确认修改前状态
首先只使用虚拟名称。PATH 不要修改诸如 或现有的 API 密钥。
$name = 'PAPANDA_DEMO'
[pscustomobject]@{
Process = [Environment]::GetEnvironmentVariable($name, 'Process')
User = [Environment]::GetEnvironmentVariable($name, 'User')
Machine = [Environment]::GetEnvironmentVariable($name, 'Machine')
}
在 .NET 的 Environment API 中,可以通过指定 target 来进行读写。
首先仅修改 Process
$env:PAPANDA_DEMO = 'process-only' Write-Host "[RESULT] current process = $env:PAPANDA_DEMO"
在这种状态下即使打开 Windows 的“环境变量” GUI,用户环境变量列表中通常也不会出现 PAPANDA_DEMO 。因为这是仅为当前 PowerShell process 设置的。
flowchart LR
P[現在のPowerShell Process] -->|$env:で設定| PE[Process environment]
U[User environment] --> N[新しく起動するProcess]
M[Machine environment] --> N
PE -. 現在のProcessだけ .-> P
仅对 User 进行一处设置
接下来向 User 作用域设置虚拟值。由于 Machine 涉及管理员权限且影响范围较广,本次修改实验中不予涉及。
[Environment]::SetEnvironmentVariable(
'PAPANDA_DEMO',
'user-value',
'User'
)
Write-Host '[SUCCESS] User scopeへPAPANDA_DEMOを設定しました'
通过 GUI 核对答案
如果是 Windows 11,请从“系统属性”中打开“环境变量”,用户环境变量中确认是否有 PAPANDA_DEMO = user-value 。
这里需要明白的不是“PowerShell 和 GUI 拥有各自独立的设置”,而是通过不同的入口查看相同的 User 作用域设置这一事实。
再次在控制台中确认
[Environment]::GetEnvironmentVariable('PAPANDA_DEMO', 'User')
user-value 如果返回了 ,说明 GUI 和控制台的观察结果一致。
需要注意的是,已经启动的 process 的 $env:PAPANDA_DEMO 并不一定会自动替换为 User 值。请留意新 process 接收环境时的时机差异。
尝试修改一处
仅将 User 值从 user-value 修改为 user-value-2 ,然后重新打开 GUI 确认显示内容是否发生了变化。
[Environment]::SetEnvironmentVariable(
'PAPANDA_DEMO',
'user-value-2',
'User'
)
恢复原状
测试结束后,删除 User 作用域的虚拟变量。
[Environment]::SetEnvironmentVariable(
'PAPANDA_DEMO',
$null,
'User'
)
Remove-Item Env:PAPANDA_DEMO -ErrorAction SilentlyContinue
Write-Host '[CLEANUP] PAPANDA_DEMOを削除しました'
确认其也已从 GUI 中消失。
如果在工作中应用
环境变量虽然方便,但并不是存放机密信息的万能场所。
区分 Process/User/Machine 的影响范围
不要直接复制粘贴教程来修改 Machine PATH
切勿将真实的 API 密钥显示在屏幕或日志中
服务有时会在与交互式用户不同的环境中运行
切勿将设置来源分散到多处
在运维中,明确“设置在了哪里”非常重要。
官方信息与一手资料
总结
Process/User/Machine 尽管同属“环境变量”,但其生命周期与影响范围各不相同。将虚拟变量设置到 User 作用域中,并在 GUI 和 PowerShell 中双重确认后再行删除,能够安全地体验到“其实是在通过不同入口查看 Windows 设置”这一本质。
