Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Проверка присутствия пакета обновления в системе перед установкой

Ответить
Настройки темы
CMD/BAT - [решено] Проверка присутствия пакета обновления в системе перед установкой

Аватара для osmaster

Пользователь


Сообщения: 107
Благодарности: 17

Профиль | Отправить PM | Цитировать


Изменения
Автор: osmaster
Дата: 24-10-2017
Установка пакетов обновлений для 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, созданный в процессе работы скрипта. Если "ошибочных" состояний нет, то проблем быть не должно: установиться то чего нет, и пропустится то что уже установлено.
Использование данного скрипта для обновления ОС недостающими пакетами значительно экономит время!

Отправлено: 18:56, 24-10-2017

 


Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Проверка присутствия пакета обновления в системе перед установкой

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
[решено] Проверка процессора перед покупкой NIK007 Процесcоры 4 17-10-2015 22:54
Любой язык - [решено] определение присутствия в системе дисковода Fortress1 Скриптовые языки администрирования Windows 5 14-08-2013 15:57
2010 - Как определить версию пакета обновления Sparkster Microsoft Office (Word, Excel, Outlook и т.д.) 1 10-01-2012 01:25
Загрузка - установка пакета обновления infected09 Microsoft Windows 7 1 13-11-2011 21:34
7 / 2008 R2 - Пауза перед установкой Hector Автоматическая установка Windows 11 / 10 / 8 / 7 / Vista 0 23-04-2010 00:18




 
Переход