Windows用于显示更新计数的标准是什么?

时间:2012-03-09 19:34:24

标签: powershell windows-update

我厌倦了编写一个Powershell脚本,该脚本将返回Windows更新的计数,与Windows返回计数的方式相同。我遇到的问题是我不能将我的计数与Window的Update返回的计数相匹配
例如,我的脚本可能会返回:
关键数:0
重要数量:1
可选数量:30

但Windows Update会说:有 关键数:1
重要数量:1
可选数:29

有谁知道Windows使用什么标准来显示Windows Update中的计数?
以下是我的代码示例:

# ----- Get All Assigned updates --------
$UpdateSession = New-Object -ComObject "Microsoft.Update.Session"
$UpdateSearcher = $UpdateSession.CreateUpdateSearcher()
$SearchResult = $UpdateSearcher.Search('IsInstalled=0')

# ----- Matrix Results for type of updates that are needed --------
$critical = $SearchResult.updates | where { $_.MsrcSeverity -eq "Critical" }
$important = $SearchResult.updates | where { $_.MsrcSeverity -eq "Important" }
$optional = $SearchResult.updates | where { ($_.MsrcSeverity -ne "Critical") -and ($_.MsrcSeverity -ne "Important") }


2 个答案:

答案 0 :(得分:3)

尝试运行此功能,不确定它是否能解决您的问题。我没有可访问的PowerShell。

#Get All Assigned updates in $SearchResult
$UpdateSession = New-Object -ComObject Microsoft.Update.Session
$UpdateSearcher = $UpdateSession.CreateUpdateSearcher()
$SearchResult = $UpdateSearcher.Search("IsAssigned=1 and IsHidden=0 and IsInstalled=0")


#Matrix Results for type of updates that are needed
$Critical = $SearchResult.updates | where { $_.MsrcSeverity -eq "Critical" }
$important = $SearchResult.updates | where { $_.MsrcSeverity -eq "Important" }
$other = $SearchResult.updates | where { $_.MsrcSeverity -eq $null }

#Write Results
Write-Host "total=$($SearchResult.updates.count)"
Write-Host "critical=$($Critical.count)"
Write-Host "important=$($Important.count)"
Write-Host "other=$($other.count)"

答案 1 :(得分:1)

这是一篇很老的帖子,但我会分享我在解决这个问题时所发现的内容,希望其他人可能觉得它很有用。

此行为是PowerShell在从WHERE子句返回单个对象时不返回数组/集合的结果。在下面的截图中,我使用类似的代码进行了测试,并按每个MsrcSeverity级别进行了细分。未分类的严重性在其中有一个更新,但当我尝试获取计数时,PowerShell返回空值。

您还可以通过调用$ uncategorizedupdates变量看到我显示的是实际更新,而不是集合。

Screenshot of Output

要解决这个问题,我们所要做的就是将变量显式定义为[array],然后即使只有一个对象,也会返回一个对象集合。只需修改您的代码,如下所示....

[array]$critical = $SearchResult.updates | where { $_.MsrcSeverity -eq "Critical" }
[array]$important = $SearchResult.updates | where { $_.MsrcSeverity -eq "Important" }
[array]$optional = $SearchResult.updates | where { ($_.MsrcSeverity -ne "Critical") -and ($_.MsrcSeverity -ne "Important") }

我已经在Windows 10上重现了这一点,所以即使在PowerShell 5中它仍然存在问题。希望这有用。