
“命令行更新Windows”——單看標(biāo)題會(huì)有人覺得奇怪Windows更新難道不是打開設(shè)置點(diǎn)一下“檢查更新”就完事了嗎我第一次被這個(gè)問題找上門是幫一個(gè)朋友處理他公司內(nèi)網(wǎng)那批機(jī)器幾十臺(tái)Windows要打補(bǔ)丁遠(yuǎn)程桌面一臺(tái)臺(tái)點(diǎn)點(diǎn)完還要等下載、等安裝、等著看要不要重啟一天下來啥也沒干成。后來我改用命令行方式批量處理速度快了不說整個(gè)過程還能留下日志哪臺(tái)成功了、哪臺(tái)需要重啟一看便知。那之后我就把命令行更新Windows這套玩法整理了下來今天分享給有同樣需求的朋友。這篇文章適合三類人一是要給多臺(tái)機(jī)器做系統(tǒng)維護(hù)的IT運(yùn)維二是習(xí)慣用腳本自動(dòng)化一切的技術(shù)愛好者三是電腦出了問題但不想打開那個(gè)越來越慢的設(shè)置面板、更愿意在終端里解決問題的普通用戶。核心內(nèi)容覆蓋命令行更新所需的全部工具、命令、腳本寫法和問題排查思路照著一步步操作就能跑通。1. 為什么要用命令行更新Windows從一次批量維護(hù)場景說起1.1 在GUI里點(diǎn)“檢查更新”的三個(gè)痛點(diǎn)先說最直觀的痛點(diǎn)——慢。Windows的更新設(shè)置頁從點(diǎn)擊“檢查更新”到真正顯示結(jié)果經(jīng)常要轉(zhuǎn)圈幾十秒甚至幾分鐘。你在一臺(tái)機(jī)器上點(diǎn)完切到另一臺(tái)機(jī)器那個(gè)轉(zhuǎn)圈又重新來一遍。如果負(fù)責(zé)的是服務(wù)器或者遠(yuǎn)程辦公電腦還要擔(dān)心更新過程中會(huì)話會(huì)不會(huì)斷、要不要重啟純靠鼠標(biāo)操作很容易漏。第二個(gè)痛點(diǎn)是自動(dòng)化能力為零。圖形界面里的操作沒法寫進(jìn)腳本沒法放在計(jì)劃任務(wù)里定時(shí)執(zhí)行也沒法把結(jié)果導(dǎo)出成文本給團(tuán)隊(duì)其他人看。運(yùn)維里最常干的事就是“定期給機(jī)器打補(bǔ)丁”這件事如果只靠人肉點(diǎn)擊做得再好也會(huì)被重復(fù)勞動(dòng)拖垮。第三個(gè)痛點(diǎn)是可控性差。GUI更新的交互邏輯經(jīng)常變Windows 10和Windows 11的入口都不一樣企業(yè)版和家庭版顯示的選項(xiàng)也不同。點(diǎn)著點(diǎn)著你根本不知道后臺(tái)到底在干什么也不知道更新日志在哪。命令行方式在這三個(gè)問題上都有明顯優(yōu)勢可腳本化、可定時(shí)執(zhí)行、可輸出日志和狀態(tài)碼適合從“單臺(tái)維護(hù)”走向“批量管理”。1.2 命令行更新適合誰運(yùn)維、裝機(jī)黨、遠(yuǎn)程維護(hù)黨先說運(yùn)維。如果你管理著幾十臺(tái)Windows Server或者辦公PC命令行更新幾乎是必選項(xiàng)。你可以寫一個(gè)PowerShell腳本通過計(jì)劃任務(wù)或者遠(yuǎn)程執(zhí)行工具推送到所有機(jī)器統(tǒng)一觸發(fā)更新、收集結(jié)果而不是一臺(tái)臺(tái)登錄進(jìn)去點(diǎn)鼠標(biāo)。再說裝機(jī)黨。喜歡自己折騰系統(tǒng)的人經(jīng)常要裝新版系統(tǒng)、打全補(bǔ)丁、裝常用軟件。命令行更新可以讓你把“系統(tǒng)更新”這個(gè)步驟直接寫進(jìn)一鍵安裝腳本里省去等待GUI的時(shí)間和手動(dòng)確認(rèn)的麻煩。遠(yuǎn)程維護(hù)黨也適合。你用遠(yuǎn)程會(huì)話連上對方電腦時(shí)圖形界面經(jīng)??D、渲染遲鈍但命令行窗口卻非常輕量。在命令行下觸發(fā)更新并讀取日志比來回點(diǎn)設(shè)置頁順暢很多。值得注意的是命令行更新并不排斥圖形界面。你完全可以平時(shí)用GUI手動(dòng)更新遇到批量、定時(shí)、遠(yuǎn)程場景再用命令行。兩者是互補(bǔ)關(guān)系不存在誰替換誰。1.3 先分清系統(tǒng)更新與軟件更新兩條技術(shù)路線在動(dòng)手之前建議大家先明確一個(gè)概念命令行更新Windows到底更新的是什么系統(tǒng)更新指的是Windows Update通道推送的補(bǔ)丁包括安全更新、累積更新、驅(qū)動(dòng)補(bǔ)丁等走的是系統(tǒng)的更新服務(wù)軟件更新指的是第三方軟件的升級比如Chrome、7-Zip、Notepad這些。系統(tǒng)更新的命令行方案當(dāng)前主流的做法是用PowerShell模塊“PSWindowsUpdate”或者調(diào)用系統(tǒng)自帶的更新入口命令“UsoClient”。軟件更新則一般用“winget”這個(gè)Windows包管理器來完成它也能更新很多常用軟件。這兩條路線經(jīng)常被混在一起討論但底層機(jī)制完全不一樣。寫腳本時(shí)要把它們區(qū)分開系統(tǒng)更新用系統(tǒng)更新模塊軟件更新用winget如果把它們混在一個(gè)命令里執(zhí)行反而容易因?yàn)闄?quán)限、更新源的問題導(dǎo)致部分任務(wù)失敗。2. 命令行更新Windows的核心命令與工具盤點(diǎn)2.1 別再用了wuauclt 的前世今生只要你在網(wǎng)上搜索過“命令行更新Windows”大概率會(huì)看到類似“wuauclt /updatenow”這樣的命令。這個(gè)命令確實(shí)曾經(jīng)是Windows更新命令行操作的代表很多老教程里都推薦過。但這里要先給大家潑一盆冷水在新版Windows里wuauclt已經(jīng)逐漸被微軟廢棄尤其在某些系統(tǒng)版本里執(zhí)行后根本不會(huì)有任何效果。wuauclt的全稱是Windows Update AutoUpdate Client在Windows 7、Windows 8時(shí)代它確實(shí)是用來手動(dòng)觸發(fā)更新掃描的主要命令行工具。操作方式是運(yùn)行wuauclt /detectnow或者wuauclt /updatenow系統(tǒng)就會(huì)從微軟服務(wù)器檢查并下載更新。但從Windows 10 1803版本開始微軟把更新掃描的底層組件換成了“更新編排器”Update Orchestratorwuauclt的核心功能就不再被維護(hù)了。在我實(shí)際測試中Windows 10 22H2和Windows 11執(zhí)行wuauclt /updatenow大部分情況下是“命令執(zhí)行了但什么都沒發(fā)生”。原因很簡單這個(gè)命令只是給舊版更新服務(wù)發(fā)信號而現(xiàn)在真正干活的已經(jīng)是UsoClient和它背后的UsoSvc服務(wù)了。所以看到老教程里寫wuauclt大家要心里有數(shù)它已不適合作為當(dāng)前的主力方案。2.2 UsoClient微軟官方保留下來的命令行更新入口wuauclt被淘汰后微軟官方在系統(tǒng)里內(nèi)置了一個(gè)新的命令行更新入口叫UsoClient全稱是Update Session Orchestrator Client直譯過來是“更新會(huì)話編排客戶端”。在命令行里輸入以下命令可以觸發(fā)更新掃描UsoClient StartScan系統(tǒng)會(huì)立即在后臺(tái)執(zhí)行一次更新檢查但這里要特別提醒UsoClient不會(huì)在命令行窗口里返回任何掃描結(jié)果它只負(fù)責(zé)“觸發(fā)動(dòng)作”。你想知道有沒有更新、安裝是否成功還得靠其他方式去查比如看Windows事件日志、查看SoftwareDistribution目錄或者等系統(tǒng)自己在后臺(tái)安裝。UsoClient還有幾個(gè)實(shí)用子參數(shù)UsoClient StartDownload UsoClient StartInstall UsoClient StartInteractiveScan UsoClient RefreshSettingsStartDownload會(huì)觸發(fā)下載StartInstall會(huì)觸發(fā)安裝StartInteractiveScan會(huì)彈出當(dāng)前用戶的交互式更新窗口。RefreshSettings常用于企業(yè)環(huán)境中刷新組策略下發(fā)的更新設(shè)置讓新配置立即生效。我在實(shí)際運(yùn)維中很少單獨(dú)依賴UsoClient因?yàn)樗环祷亟Y(jié)果沒法直接告訴我們“有幾條更新、安裝成功沒有”。它的價(jià)值在于配合腳本使用先用UsoClient啟動(dòng)掃描再等待一段時(shí)間然后通過事件日志或更新記錄判斷是否完成。如果你只需要一個(gè)“觸發(fā)更新”的入口UsoClient是最合適、最官方的選擇。2.3 PSWindowsUpdate實(shí)戰(zhàn)中最靠譜的PowerShell模塊如果說UsoClient是官方給的“簡易觸發(fā)器”那PSWindowsUpdate就是運(yùn)維社區(qū)公認(rèn)的“實(shí)戰(zhàn)主力”。這是一個(gè)第三方PowerShell模塊底層封裝了Windows更新代理的COM接口能做的事情比UsoClient多得多列出可用更新、下載更新、安裝更新、隱藏更新、查看歷史、控制自動(dòng)重啟基本覆蓋了命令行管理更新的大部分需求。安裝方式很簡單在管理員權(quán)限的PowerShell里執(zhí)行Install-Module -Name PSWindowsUpdate -Force如果你的系統(tǒng)執(zhí)行策略默認(rèn)較嚴(yán)格可以先放開當(dāng)前用戶的限制Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force安裝完成后輸入下面這條命令就能列出當(dāng)前系統(tǒng)缺失的更新Get-WindowsUpdate輸出結(jié)果中會(huì)顯示更新的標(biāo)題、KB編號、分類、是否已下載等信息。想直接安裝可以執(zhí)行Install-WindowsUpdate -AcceptAll -AutoReboot-AcceptAll表示自動(dòng)接受所有更新協(xié)議-AutoReboot表示安裝完成后自動(dòng)重啟。如果不希望系統(tǒng)自動(dòng)重啟可以換成-IgnoreReboot這樣就把“是否重啟”的決策權(quán)留給你自己。在我的使用心得里PSWindowsUpdate最香的地方是它在腳本環(huán)境里很穩(wěn)定返回對象結(jié)構(gòu)清晰方便寫判斷邏輯。比如可以先獲取待更新列表判斷數(shù)量再?zèng)Q定是否安裝。這在批量管理時(shí)非常有用。2.4 容易忽略的輔助命令服務(wù)管理、DISM、日志轉(zhuǎn)換命令行更新Windows除了觸發(fā)更新本身還少不了一些輔助操作。更新相關(guān)的Windows服務(wù)如果停止了命令執(zhí)行得再標(biāo)準(zhǔn)也沒用所以服務(wù)管理命令必不可少。常用的兩條是net stop wuauserv net start wuauservwuauserv是Windows Update服務(wù)很多更新問題都是它卡死或異常導(dǎo)致的手動(dòng)重啟服務(wù)是排查的第一步。還有一條服務(wù)也要留意——UsoSvc也就是更新編排服務(wù)。在部分系統(tǒng)里UsoSvc被優(yōu)化工具禁用后UsoClient會(huì)直接報(bào)錯(cuò)。檢查它和啟動(dòng)它的命令是sc query usosvc sc start usosvc另外當(dāng)系統(tǒng)補(bǔ)丁打不上、更新一直失敗時(shí)我習(xí)慣先用DISM檢查系統(tǒng)映像完整性dism /online /cleanup-image /restorehealth這條命令會(huì)從Windows更新或本地映像源修復(fù)系統(tǒng)文件。跑完再做一次系統(tǒng)文件檢查sfc /scannow這兩個(gè)命令不是直接“打補(bǔ)丁”但它們能解決很多因?yàn)橄到y(tǒng)文件損壞而導(dǎo)致的更新失敗問題屬于更新排查里的前置武器。最后別忘了日志轉(zhuǎn)換命令。新版Windows的更新日志默認(rèn)存在ETL格式的事件追蹤文件里不方便直接閱讀。執(zhí)行Get-WindowsUpdateLog系統(tǒng)會(huì)自動(dòng)把ETL日志轉(zhuǎn)換成可讀的文本文件保存在C:\Windows\Logs\WindowsUpdate\目錄下。這個(gè)命令在用命令行排查更新問題時(shí)很關(guān)鍵后面我還會(huì)詳細(xì)講。2.5 記不住命令一張速查表收好為了避免大家在文章里翻來翻去找命令我把常用的“命令行更新Windows”操作整理成了表格方便直接復(fù)制使用。需求命令說明觸發(fā)更新掃描UsoClient StartScan官方入口無輸出觸發(fā)更新安裝UsoClient StartInstall官方入口無輸出列出可用更新Get-WindowsUpdate需先安裝PSWindowsUpdate安裝所有更新Install-WindowsUpdate -AcceptAll -IgnoreReboot安裝但不重啟安裝并自動(dòng)重啟Install-WindowsUpdate -AcceptAll -AutoReboot適合無人值守查看更新歷史Get-WUHistory需先安裝PSWindowsUpdate重啟Windows Update服務(wù)net stop wuauserv net start wuauserv更新卡住時(shí)常用清理更新緩存見第4.2節(jié)刪除SoftwareDistribution修復(fù)系統(tǒng)映像dism /online /cleanup-image /restorehealth更新失敗排查轉(zhuǎn)換更新日志Get-WindowsUpdateLog生成可讀日志這張表基本覆蓋了一個(gè)普通用戶或運(yùn)維人員的日常需求。需要注意的是前兩條命令來源于系統(tǒng)自帶功能后四條需要額外安裝PSWindowsUpdate模塊。3. 實(shí)戰(zhàn)一行命令完成Windows更新的完整流程3.1 環(huán)境準(zhǔn)備管理員權(quán)限、執(zhí)行策略、模塊安裝命令行更新Windows第一步不是敲命令而是把環(huán)境準(zhǔn)備好。整個(gè)操作過程建議統(tǒng)一在“管理員權(quán)限的PowerShell”里進(jìn)行因?yàn)楦路?wù)涉及系統(tǒng)級寫入普通權(quán)限很難觸達(dá)。打開管理員PowerShell的方法按Win鍵輸入powershell在搜索結(jié)果里右鍵點(diǎn)擊“Windows PowerShell”選擇“以管理員身份運(yùn)行”。Windows 11里還可以在終端窗口里按下CtrlShiftEnter直接以管理員身份打開。打開之后建議先確認(rèn)一下當(dāng)前系統(tǒng)的版本和更新狀態(tài)systeminfo | findstr /B /C:OS Name /C:OS Version然后設(shè)置PowerShell執(zhí)行策略方便后續(xù)運(yùn)行腳本和安裝模塊Set-ExecutionPolicy RemoteSigned -Scope CurrentUser -Force這里解釋一下RemoteSigned的含義本機(jī)創(chuàng)建的腳本可以運(yùn)行從網(wǎng)上下載的腳本需要數(shù)字簽名普通場景夠用且安全。設(shè)置好之后安裝模塊Install-Module -Name PSWindowsUpdate -Force -AllowClobber如果提示“NuGet提供程序未安裝”按提示選擇“是”安裝即可。整個(gè)安裝過程通常在幾十秒到幾分鐘不等取決于網(wǎng)絡(luò)情況??吹侥K提示符變化且不再報(bào)錯(cuò)環(huán)境就準(zhǔn)備好了。3.2 手動(dòng)更新操作檢查、下載、安裝、重啟四步走環(huán)境準(zhǔn)備好之后先做一次手動(dòng)全流程操作便于理解整個(gè)命令行更新過程的節(jié)奏。第一步列出缺失的更新Get-WindowsUpdate輸出結(jié)果大概長這樣Computer: DESKTOP-XXXX Scanning... No updates are available for this computer.如果系統(tǒng)已經(jīng)打全了補(bǔ)丁會(huì)提示“No updates are available”。如果還有缺失更新會(huì)列出標(biāo)題、編號和分類。第二步把掃描到的更新下載并安裝Install-WindowsUpdate -AcceptAll這里我建議先不帶-AutoReboot因?yàn)橛行└掳惭b完后需要重啟才能生效但如果你正在處理重要工作自動(dòng)重啟會(huì)打斷你。單獨(dú)執(zhí)行安裝命令后系統(tǒng)會(huì)經(jīng)歷“下載、安裝、等待重啟”的過程命令窗口會(huì)輸出安裝進(jìn)度和結(jié)果。第三步根據(jù)系統(tǒng)提示決定是否重啟shutdown /r /t 60這條命令表示60秒后重啟留出保存文件的時(shí)間。如果你平時(shí)容易忘事也可以直接執(zhí)行shutdown /r /t 0立即重啟。手動(dòng)流程走一遍之后你就對命令的執(zhí)行時(shí)間、輸出結(jié)果、系統(tǒng)反應(yīng)有了直觀感受。接下來就可以把它升級成自動(dòng)化腳本了。3.3 寫一個(gè)無人值守更新腳本日志、超時(shí)、異常處理自動(dòng)化更新的核心是腳本一個(gè)好的更新腳本至少要有三部分更新前確認(rèn)、更新中執(zhí)行更新、更新后記錄結(jié)果。下面這個(gè)腳本是我在實(shí)際運(yùn)維中用過的簡化版本你把它保存為Update-Windows.ps1然后用管理員PowerShell調(diào)用即可。# 參數(shù)定義 $LogFile C:\Windows\Logs\WindowsUpdate\WU-Auto-$(Get-Date -Format yyyyMMdd-HHmmss).log # 記錄日志函數(shù) function Write-Log { param([string]$Message) $Time Get-Date -Format yyyy-MM-dd HH:mm:ss $Time $Message | Out-File $LogFile -Append } Write-Log Windows Update Start try { # 檢查更新 Write-Log Scanning for updates... $Updates Get-WindowsUpdate if ($null -eq $Updates -or ($Updates | Measure-Object).Count -eq 0) { Write-Log No updates found. exit 0 } # 統(tǒng)計(jì)并記錄 $Count ($Updates | Measure-Object).Count Write-Log Found $Count updates. $Updates | ForEach-Object { Write-Log - $($_.Title) } # 安裝更新 Write-Log Installing updates... Install-WindowsUpdate -AcceptAll -IgnoreReboot Write-Log Installation completed. } catch { Write-Log ERROR: $_ exit 1 } Write-Log Windows Update End exit 0這個(gè)腳本做的事情很直白先掃描沒有更新就結(jié)束有更新就記錄列表并安裝安裝過程不自動(dòng)重啟把重啟決策權(quán)留給你。日志文件寫到WindowsUpdate目錄下方便后續(xù)排查。寫腳本時(shí)有幾個(gè)容易踩的坑。第一Get-WindowsUpdate如果一條更新都沒有返回的結(jié)果可能是$null也可能是空集合所以判斷條件要同時(shí)考慮兩種情況。第二Install-WindowsUpdate的輸出非常大如果直接輸出到控制臺(tái)腳本反而顯得混亂建議像上面一樣把進(jìn)度記錄到日志里。第三腳本里的路徑一定要確認(rèn)存在比如C:\Windows\Logs\WindowsUpdate\目錄如果不存在腳本會(huì)報(bào)錯(cuò)。3.4 用任務(wù)計(jì)劃程序?qū)崿F(xiàn)定時(shí)自動(dòng)更新腳本寫好后如果你希望它在每周固定時(shí)間自動(dòng)跑可以借助系統(tǒng)自帶的任務(wù)計(jì)劃程序。命令行注冊任務(wù)可以一步到位比GUI里點(diǎn)來點(diǎn)去更方便管理。用管理員權(quán)限的PowerShell或CMD執(zhí)行schtasks /Create /TN WindowsAutoUpdate /TR powershell.exe -ExecutionPolicy Bypass -File C:\Scripts\Update-Windows.ps1 /SC WEEKLY /D SUN /ST 03:00 /RU SYSTEM這條命令創(chuàng)建了一個(gè)名為“WindowsAutoUpdate”的計(jì)劃任務(wù)每周日凌晨3點(diǎn)以SYSTEM權(quán)限運(yùn)行更新腳本。其中/SC WEEKLY表示每周執(zhí)行/D SUN表示周日/ST 03:00表示凌晨3點(diǎn)/RU SYSTEM表示以系統(tǒng)賬戶運(yùn)行。使用SYSTEM賬戶運(yùn)行的好處是不需要額外輸入密碼也不會(huì)因?yàn)橛脩魶]有登錄而錯(cuò)過任務(wù)。不過要提醒一句以SYSTEM身份運(yùn)行PowerShell腳本時(shí)腳本里調(diào)用的模塊和命令必須對SYSTEM用戶可見。PSWindowsUpdate安裝到當(dāng)前用戶目錄時(shí)SYSTEM賬戶不一定能找到所以安裝模塊時(shí)建議加上-Scope AllUsersInstall-Module -Name PSWindowsUpdate -Force -Scope AllUsers這樣就避免了“計(jì)劃任務(wù)執(zhí)行了但找不到模塊命令”的問題。3.5 擴(kuò)展winget 一鍵更新第三方軟件系統(tǒng)更新管理好了第三方軟件也不能落下。Windows 10 1809之后的系統(tǒng)自帶winget包管理器它可以批量更新已安裝的軟件。在管理員PowerShell里執(zhí)行winget upgrade --all這條命令會(huì)掃描并升級所有由winget支持的已安裝軟件。加上--accept-source-agreements和--accept-package-agreements參數(shù)可以跳過所有協(xié)議確認(rèn)實(shí)現(xiàn)徹底靜默winget upgrade --all --accept-source-agreements --accept-package-agreements使用winget時(shí)有個(gè)小技巧先執(zhí)行winget upgrade單獨(dú)看一遍更新列表確認(rèn)沒有你不希望升級的軟件再執(zhí)行帶--all的全量更新。某些專業(yè)軟件比如顯卡驅(qū)動(dòng)控制面板升級后可能會(huì)和已有配置不一致這類軟件可以考慮在winget里標(biāo)記為“待定”避免全量更新時(shí)被意外升級。在實(shí)際維護(hù)中我習(xí)慣把系統(tǒng)更新和軟件更新寫成兩個(gè)腳本分開執(zhí)行。原因是系統(tǒng)更新可能需要重啟而軟件更新不一定把兩者合在一起反而讓“是否需要重啟”這個(gè)判斷變得混亂。先跑系統(tǒng)更新確認(rèn)系統(tǒng)重啟完畢再跑軟件更新是最穩(wěn)妥的順序。4. 更新失敗怎么辦命令行排查實(shí)戰(zhàn)記錄4.1 常見更新錯(cuò)誤碼與排查方向命令行更新雖然比GUI可靠但該失敗照樣失敗。我在實(shí)踐中遇到的更新錯(cuò)誤碼里比較常見的有以下幾類這里直接整理成表格方便大家對照排查。錯(cuò)誤碼常見原因排查方向0x80070005權(quán)限不足或某文件被占用用管理員權(quán)限執(zhí)行命令檢查殺毒軟件0x80070422Windows更新服務(wù)未運(yùn)行或被禁用啟動(dòng)wuauserv服務(wù)0x80070643安裝程序執(zhí)行失敗通常和.NET或VC運(yùn)行庫相關(guān)先修復(fù)系統(tǒng)映像再重試0x80240034更新被策略阻止或未找到檢查組策略里的更新設(shè)置0x800f081f更新源不可用可能缺組件用DISM修復(fù)系統(tǒng)映像0x80073712系統(tǒng)文件損壞執(zhí)行sfc /scannow排查錯(cuò)誤碼的原則很簡單先看服務(wù)是否存在、是否運(yùn)行再看系統(tǒng)映像是否完整然后看更新緩存是否損壞最后才考慮網(wǎng)絡(luò)和防火墻的問題。大多數(shù)更新失敗都逃不出這個(gè)套路。4.2 更新緩存目錄清理SoftwareDistribution的正確操作更新失敗最常見的修復(fù)手段之一是清理Windows更新緩存目錄。這個(gè)目錄是C:\Windows\SoftwareDistribution里面存放著系統(tǒng)下載的更新文件。如果下載的文件損壞、權(quán)限混亂或者中途被打斷更新過程就沒法正常進(jìn)行。清理步驟要嚴(yán)格按順序來。第一步停止Windows Update服務(wù)net stop wuauserv有條件的話也順手把后臺(tái)智能傳輸服務(wù)BITS一并停掉net stop bits第二步刪除緩存目錄里的Download子目錄內(nèi)容rmdir /s /q C:\Windows\SoftwareDistribution\Download第三步重新啟動(dòng)服務(wù)net start bits net start wuauserv第四步重新觸發(fā)一次更新掃描UsoClient StartScan或者用PSWindowsUpdate再檢查一次Get-WindowsUpdate清理緩存并不會(huì)刪除已安裝的補(bǔ)丁只會(huì)把“下載的安裝包”清除系統(tǒng)在下次掃描時(shí)會(huì)重新下載所以不用擔(dān)心系統(tǒng)變“舊”。這個(gè)操作是我在排查更新失敗時(shí)最常做的一步成功率很高。4.3 從WindowsUpdate.log和事件日志里挖線索如果清理緩存和服務(wù)重啟后問題依舊就得看日志了。更新日志是排查問題的第一手資料。新版Windows中更新日志默認(rèn)以ETL格式存在命令行的查看方式有兩種。第一種是用系統(tǒng)事件查看器但這里不講GUI只看命令行。在PowerShell里查最近更新相關(guān)的錯(cuò)誤事件可以執(zhí)行Get-WinEvent -LogName Microsoft-Windows-WindowsUpdateClient/Operational -MaxEvents 30 | Where-Object { $_.LevelDisplayName -eq 錯(cuò)誤 -or $_.LevelDisplayName -eq 警告 } | Format-List TimeCreated, Id, LevelDisplayName, Message這個(gè)命令會(huì)把最近的更新錯(cuò)誤事件按可讀格式輸出來。事件日志的優(yōu)勢是結(jié)構(gòu)清晰有時(shí)間和事件ID適合快速定位。第二種方式是使用日志轉(zhuǎn)換命令Get-WindowsUpdateLog執(zhí)行后會(huì)在C:\Windows\Logs\WindowsUpdate\目錄生成一份可讀的WindowsUpdate.log文件。打開文件后重點(diǎn)搜索幾個(gè)關(guān)鍵詞error錯(cuò)誤、failed失敗、0x開頭的錯(cuò)誤碼。順著時(shí)間軸從下往上找一般就能看到更新的“數(shù)據(jù)下載失敗”還是“安裝階段失敗”從而進(jìn)一步判斷問題出在哪個(gè)環(huán)節(jié)。4.4 一次實(shí)測排查過程回放講一個(gè)我印象比較深的實(shí)際案例。當(dāng)時(shí)有一臺(tái)Windows 10機(jī)器無論怎么執(zhí)行Get-WindowsUpdate始終報(bào)錯(cuò)0x80240034查看更新列表為零。第一反應(yīng)是服務(wù)問題我執(zhí)行了net start wuauserv結(jié)果顯示服務(wù)已經(jīng)在運(yùn)行。接著檢查系統(tǒng)映像dism /online /cleanup-image /restorehealth這條命令跑了十幾分鐘提示發(fā)現(xiàn)損壞文件并進(jìn)行了修復(fù)。修復(fù)完以后我又執(zhí)行了一次sfc /scannow確認(rèn)系統(tǒng)文件完整。然后清理緩存、重啟服務(wù)、再次觸發(fā)更新掃描這次Get-WindowsUpdate正常列出了幾十個(gè)可用更新。整個(gè)排查過程的關(guān)鍵其實(shí)是DISM修復(fù)它把底層系統(tǒng)文件問題解決后更新流程就恢復(fù)了。這個(gè)案例想說明的是命令行更新Windows遇到問題時(shí)不要一上來就重裝系統(tǒng)。按“服務(wù)狀態(tài) - 系統(tǒng)完整性 - 緩存 - 日志”的順序排查大部分問題都能定位到具體環(huán)節(jié)是有跡可循的。5. 最后想說的幾個(gè)經(jīng)驗(yàn)細(xì)節(jié)做了這么多年系統(tǒng)維護(hù)關(guān)于命令行更新Windows最后分享幾個(gè)容易忽略但很實(shí)用的細(xì)節(jié)。第一PSWindowsUpdate這個(gè)模塊本身不是微軟官方維護(hù)的它在很多系統(tǒng)上表現(xiàn)優(yōu)秀但在個(gè)別新版本W(wǎng)indows上可能會(huì)適配不及時(shí)。如果遇到模塊不兼容的情況可以切回UsoClient觸發(fā)更新再用Get-WinEvent看日志來判斷結(jié)果。兩條路線都知道才能在實(shí)戰(zhàn)中不慌。第二自動(dòng)重啟這件事要謹(jǐn)慎。我知道很多教程推薦用-AutoReboot參數(shù)實(shí)現(xiàn)全自動(dòng)更新但如果你管理的機(jī)器上跑著業(yè)務(wù)突然重啟可能會(huì)造成更大的問題。我的習(xí)慣是平時(shí)用-IgnoreReboot等業(yè)務(wù)低峰期再手動(dòng)重啟或者寫一個(gè)專門的腳本去檢測“系統(tǒng)是否需要重啟”再?zèng)Q定重啟動(dòng)作。判斷系統(tǒng)是否需要重啟可以執(zhí)行Test-Path HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\Component Based Servicing\RebootPending如果返回True說明有更新正在等待重啟。這個(gè)注冊表路徑在沒有嚴(yán)苛條件的情況下挺好用相當(dāng)于一個(gè)“待重啟標(biāo)記”。第三日志永遠(yuǎn)比直覺可靠。很多人在命令行更新時(shí)看到命令執(zhí)行完就以為更新成功了實(shí)際上系統(tǒng)后臺(tái)可能還有失敗記錄。學(xué)會(huì)看Get-WUHistory和WindowsUpdate.log比記住一百條命令更管用。更新歷史查看方式很簡單Get-WUHistory | Select-Object -First 10最后如果你計(jì)劃把這套命令行更新方案用在生產(chǎn)環(huán)境里強(qiáng)烈建議先在測試機(jī)上跑通一遍確認(rèn)模塊安裝、腳本執(zhí)行、計(jì)劃任務(wù)、日志收集全鏈路都沒問題再推到更多機(jī)器。命令行更新Windows這件事的爽點(diǎn)在于可復(fù)制、可審計(jì)、可自動(dòng)化但前提是你得把每一個(gè)環(huán)節(jié)都摸透。希望這篇文章能幫你少走幾次彎路。