如何用PowerShell获取与Windows更新UI一致的未安装更新
问题场景
Windows设置里明明显示有5个待安装更新,但跑下面这段PowerShell脚本搜IsInstalled=0,只返回1个更新:
$session = New-Object -ComObject 'Microsoft.Update.Session'; $searcher = $session.CreateUpdateSearcher(); $search_result = $searcher.Search("IsInstalled=0"); foreach ($update in $search_result.updates) { Write $update.title }
返回的结果只有:Security Intelligence Update for Microsoft Defender Antivirus - KB2267602 (Version 1.449.152.0) - Current Channel (Broad)。
换成IsHidden=0当筛选条件,能搜到更多结果,其中包含Windows更新UI里显示的Update for Windows Security platform - KB5007651 (Version 10.0.29554.1001),但这个更新的IsInstalled属性显示是True。就算关掉重开设置、重启系统,UI里还是显示它待安装。
1. 用什么筛选器能拿到和Windows更新UI一致的结果?
想拿到和UI里一模一样的待安装更新列表,得结合多个筛选条件——因为UI里显示的不只是单纯未安装的更新,还包括正在下载、等着安装、需要重启确认的那些。试试这个复合筛选器:
$search_filter = "IsInstalled=0 AND IsHidden=0 AND IsAssigned=1"
IsInstalled=0:排除已经装完的更新IsHidden=0:排除被手动隐藏的更新IsAssigned=1:只留Windows更新服务推给你设备的更新
要是想覆盖所有处于待处理状态的更新(比如正在下载的),可以再加个条件,最终筛选语句改成这样:
$search_result = $searcher.Search("IsInstalled=0 AND IsHidden=0 AND IsAssigned=1 AND (IsDownloaded=0 OR IsDownloaded=1)")
2. 怎么拿到和UI状态一致的IsInstalled=0更新?
UI显示的“待安装”有时候会有缓存或者同步问题,就像你遇到的KB5007651明明装了,UI还显示待处理。解决办法如下:
- 重置Windows更新组件:用管理员身份打开PowerShell,跑下面的命令清缓存、重置服务:
# 停掉Windows更新相关服务 Stop-Service -Name wuauserv, cryptSvc, bits, msiserver # 重命名更新缓存文件夹 Rename-Item -Path C:\Windows\SoftwareDistribution -Destination C:\Windows\SoftwareDistribution.old Rename-Item -Path C:\Windows\System32\catroot2 -Destination C:\Windows\System32\catroot2.old # 重启服务 Start-Service -Name wuauserv, cryptSvc, bits, msiserver
- 重新同步状态:重置完组件后,再跑更新搜索脚本,用
IsInstalled=0 AND IsHidden=0 AND IsAssigned=1这个筛选器,就能拿到和UI一致的未安装更新列表了。 - 强制刷新状态:也可以跑
wuauclt /detectnow命令触发Windows更新检测,之后再执行搜索脚本。
另外,针对个别显示异常的更新(比如KB5007651),可以手动查它的实际安装状态:
Get-WindowsPackage -Online | Where-Object {$_.PackageName -like "*KB5007651*"}
要是确认已经装了,重置Windows更新组件后,UI的状态一般就同步正常了。
内容的提问来源于stack exchange,提问作者Daniel Fisher lennybacon
相关产品推荐
相关产品推荐

