我知道这个问题专门针对 Powershell 2.0,但我想分享有关在 Powershell Core (6+) 中设置代理服务器的信息,因为在其他地方很难找到。
我同意 Dandré 的观点,最好的解决方案是配置默认代理服务器。我刚刚遇到了 Powershell Core (7.1) 的问题。我正在尝试 Dandré 的建议,但没有任何效果。经过几个小时的研究和调查,我发现 Powershell Core 可能不再System.Net.WebRequest
用于发出 Web 请求,而是System.Net.Nett.HttpClient
.
当我配置好HttpClient
默认代理服务器后,所有由 Powershell(Invoke-WebRequest
、PowerShellGetFind-Module
等Install-Module
)建立的网络连接终于开始工作了。
为 Powershell Core 配置默认代理服务器
如果您需要使配置永久化,只需将以下命令添加到您的 Powershell 配置文件中。
配置特定的默认代理服务器
[System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy('http://your-proxy')
如果需要设置特定端口,请将其添加到代理服务器 URI:http://proxy:1234
中。
配置身份验证代理的凭据
如果它是身份验证代理,您需要设置用于代理身份验证的凭据。使用以下命令设置您当前登录到 Windows 的域帐户的凭据:
[System.Net.Http.HttpClient]::DefaultProxy.Credentials = [System.Net.CredentialCache]::DefaultCredentials
如果您需要不同的凭据,您可以使用Get-Credential
cmdlet,但它是交互式的,因此它不是您的 Powershell 配置文件中的理想解决方案。但我敢肯定还有其他方法。
[System.Net.Http.HttpClient]::DefaultProxy.Credentials = Get-Credential
配置代理服务器绕过
如果您只需要绕过代理服务器并使用直接连接,但 Powershell 使用的是默认系统范围的代理服务器,只需将HttpClient
的默认代理设置为null
:
[System.Net.Http.HttpClient]::DefaultProxy = New-Object System.Net.WebProxy($null)
将代理配置添加到 Powershell 配置文件
要使配置永久化,只需将您需要的命令添加到您的Powershell 配置文件中。其中有四个(所有用户,所有主机;所有用户,当前主机;当前用户,所有主机;当前用户,当前主机),但我会使用“当前用户,所有主机”。要找出特定配置文件的位置,请使用$Profile
带有配置文件名称的变量:
$Profile.CurrentUserAllHosts
它应该打印路径$Home\Documents\Powershell\profile.ps1
。
如果配置文件尚不存在,只需创建它并将配置放在那里。每次执行新的 Powershell Core ( pwsh.exe
) 实例时都会执行它。
使用环境变量配置默认代理
另一种解决方案是使用环境变量。根据文档,HttpClient
实际上是使用以下变量来初始化默认代理(如果已定义):
HTTP_PROXY
对于 HTTP 请求
HTTPS_PROXY
用于 HTTPS 请求
ALL_PROXY
对于 HTTP 和 HTTPS
NO_PROXY
可能包含从代理中排除的主机名的逗号分隔列表
一个示例用法:
ALL_PROXY='http://proxy:1234'
如果您需要传递凭据:
ALL_PROXY='http://username:password@proxy:1234'
此解决方案受到更广泛的应用程序的支持,因此它比以前的解决方案好还是坏取决于您要配置的确切内容,仅 Powershell 或其他应用程序。