Skip to content

PowerShell HTTPS Proxy 設定

在 Windows PowerShell 環境中設定 HTTPS/HTTP Proxy 的五種方式,從臨時 Session 環境變數到 WinHTTP 系統層級,含快捷開關函式範本。

概述

在企業網路環境中,PowerShell 執行的指令(Invoke-WebRequestnpm installpip 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   # 查看目前狀態

相關概念

來源