Appearance
PowerShell HTTPS Proxy 設定
在 Windows PowerShell 環境中設定 HTTPS/HTTP Proxy 的五種方式,從臨時 Session 環境變數到 WinHTTP 系統層級,含快捷開關函式範本。
概述
在企業網路環境中,PowerShell 執行的指令(Invoke-WebRequest、npm install、pip install 等)可能需要透過 Proxy 才能連線外部資源。Windows 的 Proxy 設定分為多個層級,從只影響當前 Session 的環境變數,到影響整台電腦所有程式的 WinHTTP 設定。
了解各種方式的作用範圍與持久性差異,才能在不同情境快速選擇正確的設定方法,避免「設定了但不生效」或「設定後意外影響其他程式」的問題。
核心內容
五種設定方式的作用範圍
| 方法 | 作用範圍 | 持久性 | 需要管理員 |
|---|---|---|---|
$env:HTTPS_PROXY 環境變數 | 當前 Session(能讀環境變數的工具) | 關閉後失效 | 否 |
SetEnvironmentVariable(User) | 該使用者所有未來 Session | 永久 | 否 |
SetEnvironmentVariable(Machine) | 整台電腦所有使用者 | 永久 | 是 |
-Proxy 參數 | 單一 Invoke-WebRequest 指令 | 一次性 | 否 |
.NET DefaultWebProxy | 當前 Session 所有 .NET HTTP 請求 | 關閉後失效 | 否 |
| WinHTTP | 整台電腦所有程式(含系統服務) | 永久 | 是 |
環境變數方式的適用範圍限制
設定 $env:HTTPS_PROXY 和 $env:HTTP_PROXY 只影響主動讀取這兩個環境變數的工具(如 curl、npm、pip、git),不影響使用 .NET HTTP 客戶端的 PowerShell Cmdlet(如 Invoke-WebRequest)。若需要 PowerShell 原生 Cmdlet 也走 Proxy,需額外設定 .NET DefaultWebProxy。
快捷開關函式設計
將 proxy-on / proxy-off / proxy-status 三個函式寫入 $PROFILE,是日常使用最靈活的方式:切換快速、不影響其他使用者、套用只需 . $PROFILE。適合需要頻繁在有 Proxy / 無 Proxy 環境之間切換的開發情境。這些函式可以整合進 PowerShell Terminal 美化指南 的同一份 $PROFILE,集中管理終端環境設定。
關鍵要點
$env:HTTPS_PROXY只影響能讀取環境變數的工具,不影響Invoke-WebRequest等 .NET 基礎的 Cmdlet- 永久設定(
SetEnvironmentVariable)需重新開啟 PowerShell 視窗才生效 - WinHTTP 影響範圍最廣(包含 Windows Update 等系統服務),應謹慎使用
- 帳密含特殊字元時需 URL encode(例如
@編碼為%40) - 透過
. $PROFILE立即載入 Profile 函式,不需重開視窗
實際應用
典型場景:公司內網需要走 Proxy 才能連外,但部分內部資源又不需要 Proxy。使用 proxy-on / proxy-off 快速切換 Session 層級的 Proxy;若有工具不讀環境變數,再搭配 -Proxy 參數或 .NET DefaultWebProxy 指定。
在 WSL 環境中,$env:HTTPS_PROXY 設定不會自動傳遞到 Linux 子系統,需要在 WSL 內另行設定(見 WSL 2 安裝指南(Windows 11))。
部署設定參考
臨時設定(當前 Session)
powershell
$env:HTTPS_PROXY = "http://proxy-server:port"
$env:HTTP_PROXY = "http://proxy-server:port"
# 需要帳密時
$env:HTTPS_PROXY = "http://username:password@proxy-server:port"關閉 PowerShell 視窗後即失效。
永久寫入系統環境變數
powershell
# User 層級(不需管理員)
[System.Environment]::SetEnvironmentVariable("HTTPS_PROXY", "http://proxy-server:port", "User")
[System.Environment]::SetEnvironmentVariable("HTTP_PROXY", "http://proxy-server:port", "User")
# Machine 層級(需管理員)
[System.Environment]::SetEnvironmentVariable("HTTPS_PROXY", "http://proxy-server:port", "Machine")針對單一指令指定 Proxy
powershell
Invoke-WebRequest -Uri "https://example.com" -Proxy "http://proxy-server:port"
# 需要驗證時
$cred = Get-Credential
Invoke-WebRequest -Uri "https://example.com" -Proxy "http://proxy-server:port" -ProxyCredential $cred.NET 預設 Proxy(套用至當前 Session 所有 .NET 請求)
powershell
[System.Net.WebRequest]::DefaultWebProxy = New-Object System.Net.WebProxy("http://proxy-server:port")
[System.Net.WebRequest]::DefaultWebProxy.Credentials = [System.Net.CredentialCache]::DefaultNetworkCredentials當前 Session 中所有 .NET HTTP 請求都會走此 Proxy。
WinHTTP 系統層級(需管理員)
powershell
netsh winhttp set proxy proxy-server:port # 設定
netsh winhttp show proxy # 查看
netsh winhttp reset proxy # 重設情境選擇建議
| 情境 | 建議方法 |
|---|---|
| 臨時用一下 | $env:HTTPS_PROXY |
| 每次開 PowerShell 都生效 | SetEnvironmentVariable(User)或寫進 $PROFILE |
| 只讓特定指令走 Proxy | -Proxy 參數 |
| 整台電腦所有程式都走 | WinHTTP |
快捷開關函式(加入 $PROFILE)
powershell
function proxy-on {
$env:HTTPS_PROXY = "http://your-proxy-server:port"
$env:HTTP_PROXY = "http://your-proxy-server:port"
Write-Host "Proxy ON" -ForegroundColor Green
}
function proxy-off {
Remove-Item Env:HTTPS_PROXY -ErrorAction SilentlyContinue
Remove-Item Env:HTTP_PROXY -ErrorAction SilentlyContinue
Write-Host "Proxy OFF" -ForegroundColor Yellow
}
function proxy-status {
$p = $env:HTTPS_PROXY
if ($p) { Write-Host "Proxy: $p" -ForegroundColor Green }
else { Write-Host "Proxy: OFF" -ForegroundColor Yellow }
}將
your-proxy-server:port替換為實際位址,然後執行. $PROFILE或重開視窗套用。
powershell
proxy-on # 開啟 Proxy
proxy-off # 關閉 Proxy
proxy-status # 查看目前狀態相關概念
- PowerShell Terminal 美化指南 —
$PROFILE設定與 PowerShell 終端環境整體管理,proxy 函式可整合至同一份 Profile - WSL 2 安裝指南(Windows 11) — WSL 環境下 Proxy 設定獨立管理,不繼承 Windows 的
$env:變數 - WSL 環境設定進階技巧 — WSL2 PATH 過濾與 DNS 設定,同為 Windows/WSL 混合環境調校
- 企業環境 Node.js SSL 憑證錯誤修復 — 同一企業網路情境:TLS inspection 導致 Node.js 工具 SSL 錯誤的解法