【发布时间】:2015-02-04 21:28:36
【问题描述】:
我正在编写一个 PowerShell 脚本来执行一些 Windows 更新任务。大多数任务都围绕着使用下面的代码 sn-p 获取尚未应用的 Windows 更新集合。返回该集合后,我将对其进行迭代并执行隐藏、下载或安装更新等任务。
我注意到这段代码可能需要 6 到 115 秒的时间来运行。通常,较长的运行时间是在机器重新启动或闲置超过 15 分钟之后。
但如果我打开 Windows Update 控制面板项,它立即知道有多少未完成的更新,并可以给我一个列表(集合)这些未完成的更新。如果我点击 WU 的“检查更新”链接,再次检查将需要超过 10 秒,有时该检查会产生与我打开它时立即“知道”不同的结果。
所以我假设 WUA 在某处维护一个缓存的更新集合,可能每天自动更新一次。 我的问题:我的代码如何访问该缓存,而不是运行如下所示的较长的“检查更新”代码?具体来说,我希望能尽快获得IUpdateCollection 的合作伙伴。
$Session = New-Object -ComObject Microsoft.Update.Session
$Searcher = $Session.CreateUpdateSearcher()
$Searcher.Online = $false #tested $true and $false; $true slightly slower
$Criteria = "IsInstalled=0 and Type='Software'"
$SearchResult = $Searcher.Search($Criteria)
$SearchResult.Updates
请注意,所有这些都发生在当前的 Windows2012R2 系统上。
【问题讨论】:
-
您是否检查过 WindowsUpdate.log 以了解发生了什么?
$Searcher.GetTotalHistoryCount()在运行之前显示什么? -
ST8Z6FR57ABE6A8RE9UF - WindowsUpdate.log 中没有异常。我看到 $Searcher.GetTotalHistoryCount() 立即开始并完成(返回“46”); $Searcher.Search($Criteria) 需要六秒钟才能完成。没有错误。
-
这很有趣,我知道您可以从注册表中获取号码,但所有信息都不在其中。也许它从 SoftwareDistribution 文件夹中读取清单文件?
标签: windows winapi powershell updates windows-update