使用PowerShell Profile快速设置 HTTP 代理

因为...

Windows 系统本身可以通过系统设置来HTTP代理,但是由于应用的编写方式不同,有的来自 Unix/Linux,有的是跨平台应用,有的是 PowerShell 脚本,在设计时没有专门编写读取 Windows 系统内的代理设置的代码,就需要手动设置环境变量来为应用设置代理。

由于应用读取代理的方式各不相同,例如环境变量 http_proxy, https_proxy, 或是大写的 HTTP_PROXY 或是 HTTPS_PROXY,也可能是调用 Windows 系统中设置的代理,还有的 PowerShell 脚本是读取 [Net.WebRequest]::DefaultWebProxy ,每次设置和取消都需要执行 N 条命令和多次点击操作,设置起来非常麻烦,所以查了下资料写了一段脚本,方便在 PowerShell 中快速设置 HTTP 代理。

这个脚本支持为通过上述方式获取代理设置的应用快速设置代理,也可以同时将设置应用到系统中。

怎么用?

PowerShell(<=PS 5.1) Profile 的默认位置是 $Home\Documents\PowerShell\Microsoft.PowerShell_profile.ps1,这是一个文本文件,如果不存在,手动创建即可。关于 Profile 的更多信息参见 官方文档

提示: 你可以通过在 PowerShell 中执行 notepad $Profile 的方式直接使用记事本编辑 Profile

将以下内容粘贴到文件尾部:

# Set-Proxy command
Function SetProxy() {
    Param(
        $Addr = $null,
        [switch]$ApplyToSystem
    )
    
    $env:HTTP_PROXY = $Addr;
    $env:HTTPS_PROXY = $Addr; 
    $env:http_proxy = $Addr;
    $env:https_proxy = $Addr;
  
    if ($addr -eq $null) {
        [Net.WebRequest]::DefaultWebProxy = New-Object Net.WebProxy;
        if ($ApplyToSystem) { SetSystemProxy $null; }
        Write-Output "Successful unset all proxy variable";
    }
    else {
        [Net.WebRequest]::DefaultWebProxy = New-Object Net.WebProxy $Addr;
        if ($ApplyToSystem) {
            $matchedResult = ValidHttpProxyFormat $Addr;
            # Matched result: [URL Without Protocol][Input String]
            if (-not ($matchedResult -eq $null)) {
                SetSystemProxy $matchedResult.1;
            }
        }
        Write-Output "Successful set proxy as $Addr";
    }
}
Function SetSystemProxy($Addr = $null) {
    Write-Output $Addr
    $proxyReg = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings";

    if ($Addr -eq $null) {
        Set-ItemProperty -Path $proxyReg -Name ProxyEnable -Value 0;
        return;
    }
    Set-ItemProperty -Path $proxyReg -Name ProxyServer -Value $Addr;
    Set-ItemProperty -Path $proxyReg -Name ProxyEnable -Value 1;
}
Function ValidHttpProxyFormat ($Addr) {
    $regex = "(?:https?:\/\/)(\w+(?:.\w+)*(?::\d+)?)";
    $result = $Addr -match $regex;
    if ($result -eq $false) {
        throw [System.ArgumentException]"The input $Addr is not a valid HTTP proxy URI.";
    }

    return $Matches;
}
Set-Alias set-proxy SetProxy

保存文件后重新打开一个新的 PowerShell 窗口即可。

设置当前窗口代理 :`set-proxy 'http://your-proxy:port'`
设置当前窗口代理 + 系统代理:`set-proxy 'http://your-proxy:port' -ApplyToSystem`
取消当前窗口代理:`set-proxy` (没有参数)
取消当前窗口代理 + 系统代理:`set-proxy -ApplyToSystem`

注意:

通过环境变量也就是不加 -ApplyToSystem 的方式设置代理时,代理仅在当前窗口生效。
增加 -ApplyToSystem 后系统代理的作用域为整个系统而非当前窗口,需要手动取消,但环境变量仍然只在当前窗口生效。

发表评论

电子邮件地址不会被公开。 必填项已用*标注