我知道这个问题专门针对 Powershell 2.0,但我想分享有关在 Powershell Core (6+) 中设置代理服务器的信息,因为在其他地方很难找到。
我同意 Dandré 的观点,最好的解决方案是配置默认代理服务器。我刚刚遇到了 Powershell Core (7.1) 的问题。我正在尝试 Dandré 的建议,但没有任何效果。经过几个小时的研究和调查,我发现 Powershell Core 可能不再使用System.Net.WebRequest 来发出网络请求,而是使用System.Net.Nett.HttpClient。
当我配置好HttpClient's default proxy server后,Powershell建立的所有网络连接(Invoke-WebRequest、PowerShellGet的Find-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 变量:
$Profile.CurrentUserAllHosts
它应该打印路径$Home\Documents\Powershell\profile.ps1。
如果配置文件尚不存在,只需创建它并将配置放在那里。每次执行新的 Powershell Core (pwsh.exe) 实例时都会执行。
使用环境变量配置默认代理
另一种解决方案是使用环境变量。根据documentation,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 或其他应用程序。