#windows #powershell #hotfix
#Windows #powershell #исправление
Вопрос:
Итак, недавно у нас возникли проблемы с обновлением KB971033 в нашей сети, и мне удалось получить рабочий скрипт для его удаления и повторной активации Windows, однако при попытке заставить скрипт обнаружения работать, чтобы убедиться, что он работает только на зараженных компьютерах, я не могу заставить его корректно выводить true или false при тестировании с установленными KBS.
Пока это то, что я запускаю. Независимо от того, что я делаю, выводится false. Чего-нибудь очевидного мне не хватает?
if ((get-hotfix).hotfixid -eq "KB971033") {$true} else {$false}
Ответ №1:
(get-hotfix).hotfixid
возвращает массив, поэтому вам не следует сравнивать его с -eq
.
Это должно сработать:
((Get-HotFix | Select-Object -ExpandProperty HotFixID) -contains 'KB971033')
или для краткости:
(((Get-HotFix).HotFixID) -contains 'KB971033')
Комментарии:
1. Да, по какой-то причине это работает отлично, есть ли причина, по которой мой приведенный выше код будет нормально работать в серверной среде, но не на наших конечных компьютерах, но приведенный выше код работает нормально?
2.@benrpr Согласно документам,
-eq
возвращает значение TRUE или совпадения, если одно или несколько значений идентичны шаблону. следовательно,((get-hotfix).hotfixid -eq "KB971033")
должен возвращать массив из одного элемента, содержащий строку «KB971033». Однако, насколько я могу судить, это относится к PowerShell версии 3.0 и выше. В любом случае, я никогда не использую-eq
при проверке значения в массиве.-contains
,-in
,-notcontains
и-notin
предназначены для этого.
Ответ №2:
ИМО довольно неэффективно просматривать все исправления при тестировании отдельного.
if (Get-Hotfix -ID KB971033 -EA 0) {$true} else {$false}
-EA 0
это сокращение от -ErrorAction SilentlyContinue
Ответ №3:
Может быть, попробовать
if ($(get-hotfix).hotfixid -eq "KB971033") {$true} else {$false}
«$» преобразует результат «Get-Hotfix» в объект с элементом «.HotFixID».
Комментарии:
1. Все еще выводя false при известном установленном обновлении, я начинаю думать, что проблема может заключаться в другом месте, и код на самом деле в порядке.
Ответ №4:
В моей среде Windows Server 2016 ваш код работает нормально … возможно, исправление не установлено или отсутствует в списке «get-hotfix»
В противном случае вы можете попробовать это:
$HotfixID= "KB971033"
IF((get-hotfix).hotfixid | ?{ $_ -eq $HotfixID}){$true} else {$false}
Он работает также на удаленном компьютере:
(get-hotfix).hotfixid -ComputerName "***SomeDNSName / FQDN***"
Комментарии:
1. Исправление установлено и отображается при
get-hotfix
автономном запуске. Обновленная версия скрипта по-прежнему выдает значение false