我厌倦了编写一个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") }
答案 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变量看到我显示的是实际更新,而不是集合。
要解决这个问题,我们所要做的就是将变量显式定义为[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中它仍然存在问题。希望这有用。