Установка пакетов обновлений для Windows может происходить как в автоматическом режиме службой Windows Update, так и в ручном режиме через Windows Update Stand-alone Installer (WUSA) - Автономный установщик обновлений из msu-файлов. Кроме WUSA, обновить ОС также можно с помощью Deployment Image Servicing and Management (DISM) - Система обслуживания образов развёртывания и управления ими. Используя DISM можно устанавливать обновления на не только из msu-фалов, но и из cab-файлов. Чтобы получить cab-файл пакета обновления, нужно скачать с сайта Microsoft нужный msu-файл и распаковать его запуском с ключом /extract. Замечено что установка пакетов обновлений в виде cab-файлов с помощью DISM происходит быстрее чем из msu-файлов с помощью WUSA. Я выбираю DISM для работы с обновлениями Windows, поэтому дальнейшее описание приведено для неё.
Многие системные администраторы собирают свои "коллекции" пакетов обновлений, запуская их установку в определённой последовательности через командный файл. Но иногда, обслуживая незнакомые компьютеры, точно неизвестно какие обновления установлены, а какие - нет. Если запустить установку всех обновлений из длинного списка, то при наличии некоторых обновлений в образе ОС система DISM всё равно установит их "поверх". Чтобы избежать напрасной потери времени в моём скрипте используется "функция" которая проверяет устанавливаемый пакет обновления на его присутствие в ОС. В коде скрипта, для примера, выполняется установка обновлений KB3177467 (Servicing stack update) и KB3125574 (Convenience rollup update). Также происходит автоматической определение разрядности ОС, но это не относиться к теме вопроса.
Скрипт:
Код:

@echo off
set arch=x64
if "%PROCESSOR_ARCHITECTURE%" == "x86" if not defined PROCESSOR_ARCHITEW6432 set arch=x86
echo The most important updates after SP1 (Convenience rollup) %arch%
echo -------------------------------------------------------------------------------
echo Get packages list. Please wait...
dism /English /Online /Get-Packages > "%TEMP%\packages.txt"
echo Servicing stack update: KB3177467
call :exist .\%arch%\Windows6.1-KB3177467-%arch%.cab ||^
dism /Online /Add-Package /PackagePath:.\%arch%\Windows6.1-KB3177467-%arch%.cab /Quiet /NoRestart
echo Convenience rollup update: KB3125574
call :exist .\%arch%\Windows6.1-KB3125574-v4-%arch%.cab ||^
dism /Online /Add-Package /PackagePath:.\%arch%\Windows6.1-KB3125574-v4-%arch%.cab /Quiet /NoRestart
echo -------------------------------------------------------------------------------
pause
:exist
dism /English /Online /Get-PackageInfo /PackagePath:%1 | find "Package Identity" | findstr /g:/ %TEMP%\packages.txt > nul && exit /b
exit /b 1
Описание работы:
Перед началом установки система DISM запрашивает (
/Get-Packages) у ОС список уже установленных пакетов обновлений и сохраняет его в текстовом файле в папке
%TEMP%\packages.txt. В дальнейшем перед началом установки каждого пакета обновлений происходит обращение к "функции"
:exist с передачей в качестве аргумента - пути к устанавливаемомму пакету для проверки. "Фунция"
:exist извлекает (
/Get-PackageInfo) из проверяемого пакета служебную информацию, в которой отыскивается строка
"Package Identity". Эта строка "по конвейеру" передаётся следующей команде поиска, которая ищет данную строку в сохранённом файле
%TEMP%\packages.txt. По результатам поиска возможны два варианта:
- Если обновление не обнаруживается установленным в системе, то "функция" :exist выходит с кодом %ERRORLEVEL% 1, и в этом случае происходит установка (/Add-Package) пакета системой DISM. После установки обновления (если пройдёт успешно) - обнуляется %ERRORLEVEL% и может использоваться для следующего запуска "функции" :exist;
- Если обновление обнаруживается установленным в системе, то "функция" :exist выходит с кодом %ERRORLEVEL% 0, и в этом случае установка пакета обновления не происходит, а скрипт переходит к обработке следующего пункта по списку. Необходимости обнулять %ERRORLEVEL% нет.
Возможные проблемы:
Проверка присутствующих в ОС обновлениях выполняется только по полю
"Package Identity", статус не проверяется. В нормальном состоянии пакеты имеют статус Installed (Установлен), но возможны ошибочные состояния присутствующих в системе пакетов обновлений: Superseded (Заменён), Not Present (Отсутствует), Staged (Промежуточное). Состояние присутствующих пакетов можно посмотреть открыв файл
%TEMP%\packages.txt, созданный в процессе работы скрипта. Если "ошибочных" состояний нет, то проблем быть не должно: установиться то чего нет, и пропустится то что уже установлено.
Использование данного скрипта для обновления ОС недостающими пакетами значительно экономит время!