网络手记

PowerShell 改了代理变量,重开窗口为何失效?弄清进程与用户作用域

在 PowerShell 输入 $env:HTTP_PROXY=... 后,当前窗口里的命令能走代理,重开窗口却恢复原状。这通常先要检查变量设在哪个范围,不必马上怀疑机场节点。Microsoft 文档把 Windows 环境变量分为 Process、User 和 Machine;在 PowerShell 直接改 $env:,变化只影响当前会话,随后启动的子进程可继承。

先只读核对,避免打印凭据

在旧窗口和新窗口分别检查变量是否存在,例如 [bool]$env:HTTP_PROXY、[bool]$env:HTTPS_PROXY,只记录真假,不打印可能含用户名、密码或订阅地址的完整值。再看相关程序究竟是从哪个窗口启动的。系统代理、应用内代理与环境变量是不同入口,某应用也未必读取 HTTP_PROXY。

PowerShell 当前进程、子进程和新窗口之间代理环境变量传播范围示意

示意图:当前会话设置会传给随后启动的子进程,独立新窗口未必继承这次修改。

用可逆的小实验判定范围

  1. 在当前窗口设置一个不含凭据的测试变量,例如 $env:PROXY_SCOPE_TEST='current'。在同一窗口检查它,随后从这个窗口启动一个新的 PowerShell 子进程再检查。
  2. 从开始菜单独立打开一个窗口,再检查该测试变量。若只有父子进程看得到,就符合 Process 范围行为。
  3. 删除测试变量:Remove-Item Env:PROXY_SCOPE_TEST。真正要持久保存代理设置之前,先确认应用是否需要它以及是否含密钥;不要把带凭据的代理 URL 写入全局环境。

若确有持久化需求,Microsoft 提供 User 与 Machine 范围的设置方式,但会影响更多新进程;修改前记录旧值与恢复方法。排障时优先在一个窗口内完成有限范围测试,成功后再决定是否扩大范围。

验收

记录旧窗口、新窗口、子进程各自的变量存在情况,以及相同 URL 请求的实际出站结果。若变量存在但请求仍不经代理,下一步应查该程序支持的代理方式和优先级,而不是继续反复设置变量。

可核验来源

评论

搜索文章

正在加载搜索…