让 PowerShell 自动检测代理并配置

最近经常使用 PowerShell 干活,由于所处网络环境的特殊性,我需要在 PowerShell 启用代理。目前我切换使用代理服务器的方法是在 Clash Premium 内核中开启或关闭 tap 模式。这种方式并不方便,有时候还会改变系统的网络适配器,导致其他内网互联工具无法正常使用。于是我想到,能不能通过 PowerShell 脚本来自动检测代理服务器,并配置代理设置呢?

查阅 Windows 文档,可以得知,系统的代理设置是保存在注册表中的。而在 PowerShell 种如何获取这些设置?继续查阅 PowerShell 文档得知可以使用命令 Get-ItemProperty -Path 来获取注册表值,参数跟上注册表的路径即可。

运行 Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings' 可以得到当前用户的代理设置。其中 ProxyEnable 为 1 时表示代理已启用,ProxyServer 为代理服务器地址。那么我们可以通过这两个值来配置 PowerShell 的代理设置。

CertificateRevocation    : 1
DisableCachingOfSSLPages : 0
IE5_UA_Backup_Flag       : 5.0
PrivacyAdvanced          : 1
SecureProtocols          : 10240
EnableNegotiate          : 1
MigrateProxy             : 1
ProxyEnable              : 1
ProxyOverride            : localhost;127.*;10.*;172.16.*;172.17.*;172.18.*;172.19.*;172.20.*;172.21.*;172.22.*;172.23.*
                           ;172.24.*;172.25.*;172.26.*;172.27.*;172.28.*;172.29.*;172.30.*;172.31.*;192.168.*;127.0.0.1
                           ;<local>
ProxyServer              : 127.0.0.1:18888
User Agent               : Mozilla/4.0 (compatible; MSIE 8.0; Win32)
ZonesSecurityUpgrade     : {22, 172, 17, 66…}
WarnonZoneCrossing       : 0
LockDatabase             : ******************
PSPath                   : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVers
                           ion\Internet Settings
PSParentPath             : Microsoft.PowerShell.Core\Registry::HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVers
                           ion
PSChildName              : Internet Settings
PSDrive                  : HKCU
PSProvider               : Microsoft.PowerShell.Core\Registry

image.png

这些值在获取时已被格式化,可以直接通过子属性调用。对比上图我们可以得知:

  • ProxyEnable 为 1 时表示代理已启用
  • ProxyServer 为代理服务器地址
  • ProxyOverride 为代理例外地址

将以上内容整合到 PowerShell 脚本中,我们可以得到如下脚本:

$net_setting = Get-ItemProperty -Path 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings'
if ($net_setting.ProxyEnable -eq 1) {
    $env:HTTP_PROXY = "http://$($net_setting.ProxyServer)"
    $env:HTTPS_PROXY = "http://$($net_setting.ProxyServer)"
    Write-Output "Detected system proxy: $($net_setting.ProxyServer) and enabled"
}
Remove-Variable -Name net_setting

首先获取系统代理设置,然后判断代理是否已启用,如果已启用则将代理服务器地址添加到环境变量 HTTP_PROXYHTTPS_PROXY。并提示用户已检测到代理并启用。最后清除设置用的临时变量以免影响其他软件。

将这段脚本添加到 PowerShell 的配置文件中,然后重启 PowerShell(使用常用的问编辑器编辑 $PROFILE 文件,然后将脚本内容复制到文件末尾保存即可,例如 neovim )。

nvim $PROFILE

下次启动 PowerShell 时,这个脚本会检测系统代理设置,如果代理已启用,则会将代理服务器地址赋值给环境变量 HTTP_PROXYHTTPS_PROXY。这样我们就可以让 PowerShell 在启动时自动检测代理并配置了。