2018-12-13

PowerShell: Удаление установленных обновлений за определенную дату

Как удалить все установленные обновления Windows за определенную дату? Комфортно решить поставленную задачу поможет командная оболочка PowerShell.



Содержание


Команда удаления


Команда удаления установленных обновлений за указанную дату, выглядит следующим образом:

Get-WmiObject -Class Win32_QuickFixEngineering | Where-Object {$_.InstalledOn.ToString() -match "10.11.2018"} | ForEach-Object {Start-Process "wusa.exe" @("/uninstall", "/kb:$($_.HotFixID.Substring(2))", "/norestart", "/quiet") -Wait}

Место указания даты, отмечено в коде. Дата указывается в следующем формате: Число.Месяц.Год, Месяц.Год, Год. То есть, можно выполнить удаление всех обновлений за конкретный день, за месяц, или за весь год в целом. Хочу заметить, что формат даты намного гибче. Но об этом в следующем разделе.

Выполнять данную команду нужно в запущенной оболочке PowerShell от имени администратора.



Разбор команды


Разберем, как работает команда удаления обновлений из предыдущего раздела. Команда, или конвейер команд, состоит из трех подкоманд. Первая, выполняет получение списка всех установленных обновлений. Вторая, выполняет выборку обновлений за указанную дату. Третья, выполняет запуск процесса удаления выбранных обновлений.


Получаем список всех установленных обновлений Windows в PowerShell.

Get-WmiObject -Class Win32_QuickFixEngineering


Интересующие поля, в полученном выводе, это HotFixID, номер пакета обновления, и InstalledOn, время установки обновления. Сохраним полученный объект в переменную $InstalledUpdates, для возможности дальнейшего использования последующими командами.

$InstalledUpdates = Get-WmiObject -Class Win32_QuickFixEngineering


Отфильтруем полученный объект по дате (поле InstalledOn). Для этого потребуется перебрать все элементы сохраненного объекта, и выбрать среди них те записи, дата которых нам необходима.

# Выбор обновлений, строка даты которых содержит подстроку "09"
$InstalledUpdates | Where-Object -Property InstalledOn -Match "09"

# Выбор обновлений, строка даты которых содержит подстроку "12"
$InstalledUpdates | Where-Object -Property InstalledOn -Match "12"

# Выбор обновлений, строка даты которых содержит подстроку "09" или "12"
$InstalledUpdates | Where-Object -Property InstalledOn -Match "09|12"


Сохраним отфильтрованный список в переменную $FilteredUpdates.

$FilteredUpdates = $InstalledUpdates | Where-Object -Property InstalledOn -Match "09"


Выполним команду удаления обновлений отфильтрованного списка. PowerShell не содержит командлета для выполнения удаления указанных обновлений, поэтому воспользуемся утилитой wusa.


Выполним обход фильтрованного списка, и осуществим подстановку значения поля HotFixID, каждого элемента, в команду запуска утилиты wusa.

Команда удаления указанного обновления с помощью wusa выглядит так:

wusa /uninstall /kb:номер_обновления /norestart /quiet

Номер обновления, в нашем случае, это значение поля HotFixID, но без первых двух букв KB. Теперь осуществим вызов этой команды, для каждого элемента фильтрованного списка обновлений.

$FilteredUpdates | ForEach-Object {Start-Process "wusa.exe" @("/uninstall", "/kb:$($_.HotFixID.Substring(2))", "/norestart", "/quiet") -Wait}


На скриншоте выше, я намеренно исключил аргументы /norestart и /quiet из команды запуска wusa. Сделано это чтобы продемонстрировать запуск удаления обновлений.


Сокращенная версия команды удаления


Команду удаления из первого раздел можно немного сократить используя псевдонимы.

gwmi Win32_QuickFixEngineering | ? InstalledOn -Match "10.11.2018" | %{start "wusa.exe" @("/uninstall", "/kb:$($_.HotFixID.Substring(2))", "/norestart", "/quiet") -Wait}


Удаление всех обновлений


Команда удаления всех обновлений, почти полностью похожа на команду удаления по указанной дате. Единственным отличием является то, что нет блока выборки. То есть, мы получаем список всех обновлений системы, и выполняем их удаление.

gwmi Win32_QuickFixEngineering | %{start "wusa.exe" @("/uninstall", "/kb:$($_.HotFixID.Substring(2))", "/norestart", "/quiet") -Wait}


Итог


В статье было рассмотрено: Как с помощью PowerShell выполнить удаление обновлений Windows за указанную дату? Как удалить обновление Windows через командную строку? Как удалить все обновления Windows с помощью PowerShell?

Комментариев нет :

Отправить комментарий