让 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
这些值在获取时已被格式化,可以直接通过子属性调用。对比上图我们可以得知:
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_PROXY
和 HTTPS_PROXY
。并提示用户已检测到代理并启用。最后清除设置用的临时变量以免影响其他软件。
将这段脚本添加到 PowerShell 的配置文件中,然后重启 PowerShell(使用常用的问编辑器编辑 $PROFILE
文件,然后将脚本内容复制到文件末尾保存即可,例如 neovim )。
nvim $PROFILE
下次启动 PowerShell 时,这个脚本会检测系统代理设置,如果代理已启用,则会将代理服务器地址赋值给环境变量 HTTP_PROXY
和 HTTPS_PROXY
。这样我们就可以让 PowerShell 在启动时自动检测代理并配置了。