Какие критерии использует Windows для отображения количества обновлений? - PullRequest
2 голосов
/ 09 марта 2012

Я устал писать сценарий Powershell, который будет возвращать количество доступных обновлений Windows так же, как Windows возвращает их. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу заставить свой счет совпадать с тем, которое возвращает Обновление Окна.

Например, мой скрипт может вернуть:
Критический счет: 0
Важный счет: 1
Дополнительный счетчик: 30

Но Центр обновления Windows скажет, что есть:
Критический счет: 1
Важный счет: 1
Дополнительный счетчик: 29

Кто-нибудь знает, какие критерии Windows использует для отображения счетчиков в Центре обновления Windows?
Вот пример моего кода:

# ----- 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 ]

3 голосов
/ 09 марта 2012

Попробуйте запустить это, не уверен, решит ли это ваши проблемы или нет. У меня нет доступного 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 голос
/ 23 октября 2017

Это старый пост, но я поделюсь тем, что нашел при решении этой проблемы, в надежде, что другие могут найти его полезным.

Такое поведение является результатом того, что PowerShell не возвращает массив / коллекцию, когда из предложения WHERE возвращается один объект. На скриншоте ниже я провел тест с использованием аналогичного кода и разбил его по уровням MsrcSeverity. Серьезность без категории содержала единственное обновление, но PowerShell возвращал нулевое значение, когда я пытался получить счетчик.

Вы также можете видеть, что при вызове переменной $ uncategorizedupdates мне показывают фактическое обновление, а не коллекцию.

Снимок экрана с выводом

Чтобы исправить эту проблему, все, что нам нужно сделать, это явно определить нашу переменную как [массив], и тогда она вернет коллекцию объектов, даже если присутствует только один объект. Просто измените ваш код, как показано ниже ....

[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. Надеюсь, это полезно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...