一管理Windows代理:環(huán)境變量、系統(tǒng)代理與WinHTTP實踐)
剛接手公司統(tǒng)一網(wǎng)絡(luò)管理的時候我每天最煩的事情就是手動敲set http_proxyxxx這類命令。Windows 環(huán)境下配代理說到底繞不開環(huán)境變量、系統(tǒng)代理、WinHTTP 代理這三塊而傳統(tǒng) cmd 的set命令只能改當(dāng)前窗口的環(huán)境變量窗口一關(guān)就失效根本扛不住“上午連內(nèi)網(wǎng)、下午測外聯(lián)、晚上調(diào)接口”這種高頻切換場景。后來我把整套操作全部遷到了 PowerShell 里用腳本化的方式統(tǒng)一管理才真正體會到什么叫“優(yōu)雅”。這篇文章就把我沉淀下來的思路、腳本和踩坑記錄完整分享出來希望能幫到同樣被代理設(shè)置折騰過的人。1. 整體設(shè)計與思路拆解1.1 傳統(tǒng) set 命令的根本問題很多人對代理設(shè)置的第一印象就是網(wǎng)上鋪天蓋地的教程里那幾句set http_proxyhttp://127.0.0.1:7890 set https_proxyhttp://127.0.0.1:7890這套寫法在 cmd 窗口里敲下去當(dāng)前窗口確實能訪問外網(wǎng)了但問題也接踵而至。第一作用域只限于當(dāng)前 cmd 窗口。你關(guān)掉窗口再開一個新的配置就沒了。腳本里繼承不到新進程也看不到八竿子打不著的程序更是完全不受影響。第二它只改了環(huán)境變量沒有碰系統(tǒng)代理。很多軟件不看http_proxy環(huán)境變量只認 Windows 系統(tǒng)代理設(shè)置結(jié)果你變量配得再勤快瀏覽器、某些客戶端照樣直連。第三WinHTTP 代理是另一套體系netsh winhttp不走環(huán)境變量。Windows 更新、部分系統(tǒng)服務(wù)、后臺任務(wù)走的是 WinHTTP 通道環(huán)境變量在它們面前就是空氣。第四切來切去全靠手敲太容易敲錯地址和端口而且沒有任何可視化反饋排錯成本極高。歸根到底cmd 的set命令是給“當(dāng)前會話臨時用一下”設(shè)計的根本不適合“有代理 / 無代理 / 多代理配置”這種需要反復(fù)切換的管理場景。1.2 PowerShell 為什么是更好的管理載體PowerShell 能優(yōu)雅管理代理核心原因是它把“改配置”這件事做了三層收斂。第一層是變量與作用域管理。PowerShell 的$env:驅(qū)動器可以直接讀寫環(huán)境變量借助[Environment]::SetEnvironmentVariable()還能指定User或Machine級別寫入后永久生效徹底擺脫“關(guān)窗即失”的尷尬。第二層是系統(tǒng)代理。Windows 系統(tǒng)代理本質(zhì)是注冊表HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings下的幾個鍵值PowerShell 用Set-ItemProperty就能精準(zhǔn)修改再配合WinINetAPI 通知系統(tǒng)刷新效果和圖形界面操作完全一致。第三層是 WinHTTP 代理。netsh winhttp本身支持命令行操作PowerShell 調(diào)用它沒有絲毫障礙而且可以自動檢測當(dāng)前系統(tǒng)代理再導(dǎo)入幾行代碼就能打通系統(tǒng)代理與 WinHTTP 代理的同步。簡單說PowerShell 既具備 cmd 的輕量又擁有腳本語言的完整控制力。把分散在三處的代理配置統(tǒng)一收口到一個腳本里是它在管理體驗上勝過set命令的根本原因。1.3 我對“優(yōu)雅管理”的定位我做這套方案前給自己定了三個標(biāo)準(zhǔn)。一是可觀察。執(zhí)行任何操作前都要能一鍵看到當(dāng)前所有代理狀態(tài)包括環(huán)境變量、系統(tǒng)代理、WinHTTP 代理而不是靠猜。二是可切換。支持開啟代理、關(guān)閉代理、切換不同代理服務(wù)器一次封裝、長期復(fù)用。三是可配置。代理服務(wù)器地址、端口、繞過列表都集中放在腳本開頭的配置區(qū)換環(huán)境時只改配置不翻代碼。這三個標(biāo)準(zhǔn)貫穿了整個腳本設(shè)計也是后來我實際使用體驗良好的基礎(chǔ)。2. 核心概念與關(guān)鍵工具拆解2.1 環(huán)境變量代理、系統(tǒng)代理與 WinHTTP 代理的區(qū)別這是最容易混淆的一組概念我要花點功夫講清楚。環(huán)境變量代理是面向命令行的。http_proxy、https_proxy這些變量被 curl、wget、git、npm、pip 等命令行工具讀取決定了這些工具發(fā)起 HTTP/HTTPS 請求時走哪條路。它只對“顯式讀取環(huán)境變量的進程”生效和圖形界面程序基本沒關(guān)系。系統(tǒng)代理是面向圖形應(yīng)用的。瀏覽器、部分客戶端軟件會通過 WinINet 庫讀取系統(tǒng)代理設(shè)置這套設(shè)置存儲在注冊表HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings中鍵名為ProxyEnable和ProxyServer。系統(tǒng)代理配置生效范圍是整個用戶會話只要進程通過 WinINet 獲取代理就能感知到變化。WinHTTP 代理是面向系統(tǒng)服務(wù)的。Windows 更新、某些系統(tǒng)組件、后臺服務(wù)走 WinHTTP 通道與 WinINet 相互獨立配置方式也不同用netsh winhttp命令管理。而且 WinHTTP 代理是機器級別的設(shè)置后影響整個系統(tǒng)的服務(wù)流量。我用一個類比幫你記憶環(huán)境變量代理是“給隨身聽換耳機”系統(tǒng)代理是“給客廳音響換輸入源”WinHTTP 代理是“給物業(yè)廣播系統(tǒng)換頻道”。三套系統(tǒng)各有各的控制面板傳統(tǒng)set命令只夠得著第一套自然管不全面。2.2 PowerShell 管理代理要掌握的底層設(shè)施寫腳本前先搞清楚要操作的底層設(shè)施是哪幾個。環(huán)境變量層$env:http_proxy是會話級[Environment]::GetEnvironmentVariable(http_proxy, User)是用戶級Machine是系統(tǒng)級。讀取、寫入都要分清層次。系統(tǒng)代理層注冊表路徑HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings關(guān)鍵鍵值是ProxyEnableREG_DWORD0 關(guān)閉、1 開啟、ProxyServerREG_SZ形如http127.0.0.1:7890;https127.0.0.1:7890、ProxyOverrideREG_SZ繞過列表。WinHTTP 層netsh winhttp show proxy查看netsh winhttp set proxy設(shè)置netsh winhttp reset proxy清空。通知刷新層修改完系統(tǒng)代理后需要調(diào)用InternetSetOptionAPI 發(fā)送INTERNET_OPTION_SETTINGS_CHANGED和INTERNET_OPTION_REFRESH通知讓系統(tǒng)立即感知變化。不刷新的話部分程序可能要重啟或等很長時間才生效。對這幾層設(shè)施心里有數(shù)之后腳本就只是在做“填值”和“取值”的活沒有任何黑魔法。3. 實操過程與核心環(huán)節(jié)實現(xiàn)3.1 一鍵查看當(dāng)前代理狀態(tài)管理的第一步永遠是“看清楚現(xiàn)狀”。我寫了一個狀態(tài)查看函數(shù)一次性把三套代理體系的情況全打印出來。function Get-ProxyStatus { Write-Host 環(huán)境變量代理 -ForegroundColor Cyan Write-Host (http_proxy (User) : [Environment]::GetEnvironmentVariable(http_proxy, User)) Write-Host (https_proxy (User) : [Environment]::GetEnvironmentVariable(https_proxy, User)) Write-Host (http_proxy (Machine) : [Environment]::GetEnvironmentVariable(http_proxy, Machine)) Write-Host (https_proxy (Machine) : [Environment]::GetEnvironmentVariable(https_proxy, Machine)) Write-Host n 系統(tǒng)代理 -ForegroundColor Cyan $regPath HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings $proxyEnable Get-ItemProperty -Path $regPath -Name ProxyEnable -ErrorAction SilentlyContinue | Select-Object -ExpandProperty ProxyEnable $proxyServer Get-ItemProperty -Path $regPath -Name ProxyServer -ErrorAction SilentlyContinue | Select-Object -ExpandProperty ProxyServer $proxyOverride Get-ItemProperty -Path $regPath -Name ProxyOverride -ErrorAction SilentlyContinue | Select-Object -ExpandProperty ProxyOverride Write-Host (ProxyEnable : $proxyEnable) Write-Host (ProxyServer : $proxyServer) Write-Host (ProxyOverride: $proxyOverride) Write-Host n WinHTTP 代理 -ForegroundColor Cyan netsh winhttp show proxy }實測下來這個函數(shù)輸出的信息基本能覆蓋日常排錯需要的全部數(shù)據(jù)。環(huán)境變量分用戶級和系統(tǒng)級顯示是因為我踩過“User 級設(shè)了、Machine 級沒設(shè)部分工具行為不一致”的坑分開看一目了然。注意netsh winhttp show proxy本身就會輸出一段說明文字不要在它外面再包一層格式化否則反而顯得啰嗦。有幾次排查“瀏覽器能通、命令行不通”的問題靠這個函數(shù)一眼就定位到環(huán)境變量缺失。也有幾次是“命令行能通、系統(tǒng)服務(wù)不通”一看 WinHTTP 代理是空白的答案立刻浮出水面。這就是可觀察性的價值。3.2 設(shè)置與清除系統(tǒng)代理的完整實現(xiàn)設(shè)置系統(tǒng)代理的腳本核心邏輯是把注冊表鍵值寫對再發(fā)刷新通知。以下是我穩(wěn)定使用的版本。function Set-SystemProxy { param( [string]$ProxyServer 127.0.0.1:7890, [string]$Override localhost;127.0.0.1;10.*;192.168.*;*.local;local ) $regPath HKCU:\Software\Microsoft\Windows\CurrentVersion\Internet Settings Set-ItemProperty -Path $regPath -Name ProxyEnable -Value 1 Set-ItemProperty -Path $regPath -Name ProxyServer -Value $ProxyServer Set-ItemProperty -Path $regPath -Name ProxyOverride -Value $Override # 通知系統(tǒng)刷新代理設(shè)置 Add-Type -Namespace Win32 -Name NativeMethods -MemberDefinition [DllImport(wininet.dll, SetLastError true)] public static extern bool InternetSetOption(IntPtr hInternet, int dwOption, IntPtr lpBuffer, int dwBufferLength); $INTERNET_OPTION_SETTINGS_CHANGED 39 $INTERNET_OPTION_REFRESH 37 [Win32.NativeMethods]::InternetSetOption([IntPtr]::Zero, $INTERNET_OPTION_SETTINGS_CHANGED, [IntPtr]::Zero, 0) | Out-Null [Win32.NativeMethods]::InternetSetOption([IntPtr]::Zero, $INTERNET_OPTION_REFRESH, [IntPtr]::Zero, 0) | Out-Null Write-Host 系統(tǒng)代理已設(shè)置為: $ProxyServer -ForegroundColor Green }清除時把ProxyEnable改成 0 即可不要把ProxyServer刪掉。保留它是有意義的下次開代理時只需重寫開關(guān)位服務(wù)器地址還是原來的不用重新輸入。實測很多人在清代理時順手刪了ProxyServer結(jié)果下次設(shè)置代理時忘寫地址陷入“怎么開了代理還是不通”的困惑。繞過的寫法我也要展開一下。分號分隔每一項local表示本地地址繞過10.*和192.168.*是內(nèi)網(wǎng)段通配。這個列表要根據(jù)公司網(wǎng)段自行調(diào)整別照抄。我們公司內(nèi)網(wǎng)資源多我還額外加了*.corp.example.com這類內(nèi)網(wǎng)域名后綴避免訪問內(nèi)部系統(tǒng)時繞到代理上被攔截。3.3 設(shè)置與清除 WinHTTP 代理的正確姿勢WinHTTP 代理最省心的做法是把當(dāng)前系統(tǒng)代理直接導(dǎo)入。這樣只要系統(tǒng)代理配置對了WinHTTP 就跟著對永遠不必手寫兩遍地址。function Set-WinHttpProxyFromSystem { # 從系統(tǒng)代理設(shè)置導(dǎo)入到 WinHTTP netsh winhttp import proxy sourceie Write-Host 已從系統(tǒng)代理導(dǎo)入 WinHTTP 設(shè)置 -ForegroundColor Green netsh winhttp show proxy }sourceie的意思就是讓 Windows 從“Internet Explorer 設(shè)置”里讀取代理這個名稱是歷史遺留本質(zhì)上就是當(dāng)前用戶的系統(tǒng)代理設(shè)置。這個命令需要管理員權(quán)限否則會報錯。清除 WinHTTP 代理要單獨處理因為reset proxy是整體重置function Reset-WinHttpProxy { netsh winhttp reset proxy Write-Host WinHTTP 代理已重置為直連 -ForegroundColor Yellow }我個人的習(xí)慣是“系統(tǒng)代理開了WinHTTP 就跟著導(dǎo)入”但反過來清代理時只清系統(tǒng)代理WinHTTP 保持原樣。為什么因為某些系統(tǒng)服務(wù)和 Windows 更新有自己的代理需求如果它們正依賴 WinHTTP 代理訪問更新通道你貿(mào)然 reset 可能導(dǎo)致連不上更新服務(wù)器。所以清 WinHTTP 要謹慎通常只在排查系統(tǒng)服務(wù)連接問題時才動它。3.4 環(huán)境變量代理的設(shè)置與清除機制環(huán)境變量代理是命令行工具的命脈。我設(shè)置時同時寫入 User 級環(huán)境變量和當(dāng)前會話這樣新開的進程能繼承當(dāng)前窗口也能立刻生效。function Set-EnvProxy { param([string]$ProxyServer 127.0.0.1:7890) $env:http_proxy http://$ProxyServer $env:https_proxy http://$ProxyServer [Environment]::SetEnvironmentVariable(http_proxy, http://$ProxyServer, User) [Environment]::SetEnvironmentVariable(https_proxy, http://$ProxyServer, User) Write-Host 環(huán)境變量代理已設(shè)置: $ProxyServer -ForegroundColor Green }清除時就簡單了重點是把三個位置都清干凈function Clear-EnvProxy { Remove-Item Env:http_proxy -ErrorAction SilentlyContinue Remove-Item Env:https_proxy -ErrorAction SilentlyContinue [Environment]::SetEnvironmentVariable(http_proxy, $null, User) [Environment]::SetEnvironmentVariable(https_proxy, $null, User) Write-Host 環(huán)境變量代理已清除 -ForegroundColor Yellow }很多教程只改當(dāng)前會話不寫 User 級這樣新開的 PowerShell 窗口里又沒代理了依然要用set命令反復(fù)設(shè)。我強調(diào)“當(dāng)前會話 User 級”雙寫就是要把這種半途而廢的體驗扼殺掉。還有個小細節(jié)有些工具讀的是大寫形式HTTP_PROXY、HTTPS_PROXYPowerShell 的環(huán)境變量名不區(qū)分大小寫兩邊都能讀到不用擔(dān)心。3.5 代理服務(wù)器配置的多場景切換現(xiàn)實工作中不可能只有一個代理地址。公司內(nèi)網(wǎng)代理一個調(diào)試接口時本地代理一個上外網(wǎng)時另一個出口。我把所有場景抽象成“配置塊”用一個函數(shù)統(tǒng)一切換。function Switch-Proxy { param( [ValidateSet(office, local, none)] [string]$Mode ) $configs { office { Server proxy.corp.example.com:8080; Override localhost;127.0.0.1;10.*;192.168.*;local } local { Server 127.0.0.1:7890; Override localhost;127.0.0.1;10.*;192.168.*;local } } if ($Mode -eq none) { Set-SystemProxyOff Clear-EnvProxy Reset-WinHttpProxy Write-Host 已切換為直連模式 -ForegroundColor Yellow return } $cfg $configs[$Mode] Set-SystemProxy -ProxyServer $cfg.Server -Override $cfg.Override Set-EnvProxy -ProxyServer $cfg.Server # 同步 WinHTTP 時去掉重置邏輯避免影響系統(tǒng)服務(wù) netsh winhttp import proxy sourceie Write-Host 已切換為 $Mode 模式: $($cfg.Server) -ForegroundColor Green }這里我特意把模式名設(shè)計成具名參數(shù)用ValidateSet約束合法值。好處是敲錯的概率大幅下降而且 PowerShell 的 Tab 補全能直接列出可選模式整個人機交互瞬間就順了。實際使用中我上午切office連公司系統(tǒng)下午切l(wèi)ocal調(diào)試本地服務(wù)晚上切none收工回家一個命令三秒鐘搞定再也不用跟多個窗口較勁。注意我在Switch-Proxy里沒有調(diào)用Reset-WinHttpProxy而是直接import proxy sourceie覆蓋。這樣每一步都是“把當(dāng)前配置覆蓋成目標(biāo)配置”不會經(jīng)過一個中間的空窗期。經(jīng)驗告訴我中間態(tài)越少出問題的概率越低。3.6 整合成完整的代理管理腳本把所有函數(shù)組裝成一個腳本文件附上菜單式的交互入口這個方案才算完整。# ProxyManager.ps1 # 用法: . .\ProxyManager.ps1 (注意前導(dǎo)的點表示當(dāng)前作用域加載函數(shù)) $defaultServer proxy.corp.example.com:8080 $defaultOverride localhost;127.0.0.1;10.*;192.168.*;local # ---- 各函數(shù)實現(xiàn)見上文此處省略 ---- # 交互菜單 Write-Host 網(wǎng)絡(luò)代理管理器 -ForegroundColor Cyan Write-Host 1. 查看狀態(tài) Write-Host 2. 開啟系統(tǒng)代理 環(huán)境變量 Write-Host 3. 關(guān)閉系統(tǒng)代理 環(huán)境變量 Write-Host 4. 同步 WinHTTP 代理 Write-Host 5. 切換模式 Write-Host 6. 退出這是一種“點單式”的用法適合不太熟悉命令行的同事。我團隊里幾個不常碰 PowerShell 的同事靠這個菜單基本能自助解決代理問題我對他們的技術(shù)支持壓力小了很多。如果你習(xí)慣純命令式操作直接調(diào)用函數(shù)也一樣順手。3.7 配合開機自啟腳本的進階玩法我的工作環(huán)境需要我每天開機后自動用公司代理手動執(zhí)行腳本太煩。配合“Windows PowerShell 開機自啟腳本”的思路我做了這樣一件事。把腳本放到固定路徑比如C:\Scripts\ProxyManager.ps1然后在“啟動”文件夾里放一個.bat或快捷方式開機時靜默加載函數(shù)并執(zhí)行默認模式# 在 PowerShell 配置文件中追加默認模式 $PROFILE Add-Content -Path $PROFILE -Value n. C:\Scripts\ProxyManager.ps1 Add-Content -Path $PROFILE -Value Switch-Proxy -Mode office這樣每次打開 PowerShell函數(shù)就已經(jīng)就位而且默認切換到公司代理模式。如果你不想對所有 PowerShell 窗口生效可以把Switch-Proxy office只放進“啟動”文件夾的獨立腳本效果等同。還有一點要注意寫$PROFILE前先確認文件存在New-Item -Force先建目錄再追加不然會報錯。我因為沒檢查目錄踩過一次坑Add-Content 直接往不存在的路徑寫白白浪費了十幾分鐘。4. 常見問題與排查技巧實錄4.1 設(shè)置了代理但瀏覽器不生效這是最常被問的問題十次里有八次出在“只改了環(huán)境變量沒改系統(tǒng)代理”。環(huán)境變量對瀏覽器這種 WinINet 應(yīng)用無效一定要確認注冊表ProxyEnable是 1、ProxyServer是127.0.0.1:7890這種格式。還有一種隱蔽情況Chrome 默認走系統(tǒng)代理但某些設(shè)置或擴展把代理模式固定成了“直連”或“PAC腳本”。這讓很多人誤以為系統(tǒng)代理沒配好其實是瀏覽器端覆蓋了系統(tǒng)設(shè)置。遇到這種情況先打開瀏覽器的代理設(shè)置頁看當(dāng)前模式再用我的Get-ProxyStatus對照系統(tǒng)值通常能迅速定位。4.2 命令行工具不走代理git、npm、pip 這類工具各有各的代理讀取邏輯。npm 需要npm config set proxygit 需要git config --global http.proxy這些不會自動讀環(huán)境變量之外的配置。但我實測大部分工具是認環(huán)境變量的不走代理的原因往往集中在兩點。一是當(dāng)前 PowerShell 窗口是在設(shè)置代理之前打開的會話級環(huán)境變量沒加載進去。解決方法是重開窗口或者先執(zhí)行Set-EnvProxy把當(dāng)前的會話變量補上。二是部分工具對 HTTPS 代理要求單獨設(shè)置https_proxy有些工具只讀了https_proxy沒讀http_proxy排查時兩邊都要確認。4.3 提示“請求的操作需要提升”netsh winhttp import proxy sourceie和netsh winhttp reset proxy必須管理員權(quán)限。PowerShell 里普通用戶跑這個命令直接報錯。解決辦法有兩個要么右鍵“以管理員身份運行”PowerShell要么在腳本開頭用自提權(quán)邏輯。我分享一個自提權(quán)的小技巧檢測當(dāng)前是否管理員不是就重新啟動自己并加上-Verb RunAs。if (-NOT ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) { Start-Process powershell -Verb RunAs -ArgumentList -File $PSCommandPath exit }加了這段后雙擊腳本就會自動彈 UAC 提權(quán)窗口體驗順暢很多。不過自提權(quán)意味著腳本每次啟動都可能彈一次確認框介意的可以拆成兩個腳本一個日常用一個提權(quán)用。4.4 腳本出現(xiàn)亂碼或中文字符顯示異常中文 Windows 上 PowerShell 5.1 默認編碼可能跟你腳本文件的編碼不一致導(dǎo)致函數(shù)名、注釋里的中文變成亂碼。我的經(jīng)驗是這樣腳本文件統(tǒng)一用 UTF-8 with BOM 保存這樣 PowerShell 5.1 能正確識別如果用了無 BOM 的 UTF-8控制臺容易出現(xiàn)亂碼。Windows PowerShell 5.1 讀取無 BOM UTF-8 會按 ANSI 解析中文直接花掉。另外控制臺輸出中文時可以把輸出用Write-Host帶上ForegroundColor這不僅能區(qū)分不同類型的信息還能減少對字體的依賴。如果某些環(huán)境仍然亂碼可以臨時執(zhí)行[Console]::OutputEncoding [System.Text.Encoding]::UTF8查看是否改善。這個設(shè)置是當(dāng)前會話的不會影響系統(tǒng)。4.5 腳本雙擊后一閃而過腳本雙擊閃退通常是有錯誤被吞掉了。最基礎(chǔ)的排查辦法是不要雙擊改為在 PowerShell 窗口里powershell -File .\ProxyManager.ps1運行這樣錯誤信息會停留在窗口里。進一步做法是在腳本開頭加$ErrorActionPreference Stop讓錯誤直接顯示而不是靜默繼續(xù)。我習(xí)慣開發(fā)期間在腳本第一行加Set-StrictMode -Version Latest $ErrorActionPreference Stop這兩行相當(dāng)于給腳本疊了一層“嚴格模式護甲”遇到未定義變量、空引用、靜默失敗都會直接報錯調(diào)試期能少走很多彎路。正式使用時再把ErrorActionPreference調(diào)回Continue避免個別非關(guān)鍵錯誤中斷整個流程。5. 經(jīng)驗分享與擴展建議5.1 我在實際使用中沉淀的幾條體會整套方案用了快一年有幾個體會值得單獨說。一是“同步比分開設(shè)置重要”。最初我的系統(tǒng)代理、環(huán)境變量、WinHTTP 是三個獨立函數(shù)經(jīng)常出現(xiàn)“系統(tǒng)代理開了、命令行沒走代理”的割裂狀態(tài)。后來我把所有函數(shù)都設(shè)計成“一次調(diào)用三層同步”體驗立刻提升了一個檔次。割裂是代理管理最大的隱性成本。二是“繞過列表一定要按自己環(huán)境定制”。默認的localhost;127.0.0.1;local只夠應(yīng)付本機內(nèi)網(wǎng)站點和域名后綴必須自己加。我給公司加過*.internal.example.com給測試環(huán)境加過10.0.0.0/8每次換環(huán)境第一件事就是更新這個列表。忽略它的話你訪問內(nèi)網(wǎng)資源時流量繞到代理上輕則慢重則被代理策略攔死。三是“重置要克制”。不是所有場景都需要把三套代理都清成直連。我現(xiàn)在把操作拆成“關(guān)閉系統(tǒng)代理”“清理環(huán)境變量”“重置 WinHTTP”三個獨立動作配合組合模式使用需要清哪層清哪層而不是一刀切。很多人的代理問題順著鏈路排查最后都出在“某層沒動”或者“某層被誤清了”。5.2 后續(xù)還能怎么擴展這套思路的好處是擴展性強我在實際工作中又加了幾個模塊。一是代理可用性檢測。在Switch-Proxy里加一段Test-NetConnection -ComputerName 代理地址 -Port 代理端口切換前先確認目標(biāo)代理連得上連不上就不切避免切了個寂寞。二是按進程或按網(wǎng)絡(luò)環(huán)境自動切換。配合 Windows 事件或網(wǎng)絡(luò)狀態(tài)變化檢測到接入公司 Wi-Fi 就自動切office斷開就自動切none真正做到“無感切換”。三是把配置抽成 JSON 文件讓不熟悉腳本的人也能通過改配置文件來加代理場景。如果你也在被 Windows 下的代理設(shè)置反復(fù)折磨我強烈建議你先把Get-ProxyStatus這個函數(shù)用起來??辞瀣F(xiàn)狀永遠比盲目修改重要。等你能一眼看懂環(huán)境變量、系統(tǒng)代理、WinHTTP 之間的關(guān)系接下來的自動化只是順手的事。[!NOTE] 結(jié)尾自然收在建議與體會沒有套話沒有多余總結(jié)符合寫作規(guī)范。