скрипт для установки пакета обновления для соответствующей версии windows

8784
John1256

Я создаю скрипт для установки пакета обновления для соответствующей версии Windows.

Поэтому я хочу, чтобы скрипт определил версию Windows, на которой я работаю, и установил пакет обновления, а затем выполнил команду для запуска установщика пакета обновления.

Я знаю, что могу сделать, wmic os get Captionчтобы получить версию окна и wmic os get ServicePackMajorVersionполучить пакет обновления.

И я могу start /wait %~dp0\servicepack.exeзапустить пакет обновления, но я не знаю, как соединить эти команды, поэтому, если у меня Windows 7 без пакета обновления, он установит пакет обновления Windows 7, но если я на Windows сервер будет устанавливать пакет обновления для сервера Windows. Какие-нибудь мысли?

Поэтому я провел небольшое исследование и придумал это:

wmic os get Caption if /i == goto :WinS if /i == goto :WinV if /i == goto :Win7 if /i == goto :Win8 if /i == goto :Win8.1 echo Windows Version not Suported!  pause  exit  :WinS wmic os get ServicePackMajorVersion if /i == start /wait %~dp0\servicepackSV1.exe if /i == start /wait %~dp0\servicepackSV2.exe  if /i == goto :GoodtoGo  echo Service Pack Installed!! goto : :WinV wmic os get ServicePackMajorVersion if /i == start /wait %~dp0\servicepackSV1.exe if /i == start /wait %~dp0\servicepackSV2.exe  if /i == goto :GoodtoGo  echo Service Pack Installed!! goto : :Win7 wmic os get ServicePackMajorVersion if /i == start /wait %~dp0\servicepack7.exe  if /i == goto :GoodtoGo  echo Service Pack Installed!! goto : :Win8 echo No service pack needed! goto  :Win8.1 wmic qfe get hotfixid | find "KB2919355" if %errorlevel%==0 goto :GoodtoGo start /wait %~dp0\win8.exe goto : :GoodtoGo echo The Latest ServicePack is allready installed! you'r GoodtoGo! goto 

Я еще не проверял, но будет ли это работать?

2
Подсказка: [if] (http://ss64.com/nt/if.html) - Условно выполнить команду. DavidPostill 8 лет назад 0
Как бы я использовал команду `if`? John1256 8 лет назад 0

1 ответ на вопрос

2
DavidPostill

Я не знаю, как соединить эти команды

Я знаю, что могу сделать:

 wmic os get Caption 

получить версию окна и:

 wmic os get ServicePackMajorVersion 

чтобы получить пакет обновления.

Вы действительно можете использовать wmicдля получения этих значений. Однако, чтобы использовать их позже в вашем пакетном файле (например, в ifвыражении), вам нужно сохранить значения в переменной окружения.

Вот пример того, как это сделать:

@echo off setlocal setlocal enabledelayedexpansion set _os= set _sp= rem use findstr to strip blank lines from wmic output for /f "usebackq skip=1 tokens=3" %%i in (`wmic os get caption ^| findstr /r /v "^$"`) do ( set "_os=%%i" ) for /f "usebackq skip=1 tokens=*" %%i in (`wmic os get ServicePackMajorVersion ^| findstr /r /v "^$"`) do ( set "_sp=%%i" ) echo Operating System: %_os% echo Service Pack Major Version: %_sp% endlocal 

Теперь у нас есть ОС, в которой хранится %_osосновная версия пакета обновления %_sp%.

Заметки:

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

  2. Команда forизвлекает только 3-ю часть (токен) ОС. Это будет работать для настольных версий (если вы хотите отличить Server 2008 от других версий, вам нужно будет найти другое решение).

  3. _osбудет установлен в одно из следующих значений Server, Vista, 7, 8, или 8.1, так регулярное выражение больше не требуется.

Затем нам нужно изменить ifоператоры, чтобы они использовали хранимые переменные и правильно выполняли сравнения строк.

if /i == goto :WinS 

будет выглядеть так:

if /i "%_os%" == "Server" goto :WinS 

и т.п.

Собрав все воедино, используйте следующий пакетный файл:

@echo off setlocal setlocal enabledelayedexpansion set _os= set _sp= rem use findstr to strip blank lines from wmic output for /f "usebackq skip=1 tokens=3" %%i in (`wmic os get caption ^| findstr /r /v "^$"`) do ( set "_os=%%i" ) for /f "usebackq skip=1 tokens=1" %%i in (`wmic os get ServicePackMajorVersion ^| findstr /r /v "^$"`) do ( set "_sp=%%i" ) echo Operating System: %_os% echo Service Pack Major Version: %_sp%  if /i "%_os%" == "7" echo Win7  if /i "%_os%" == "Server" goto :WinS if /i "%_os%" == "Vista" goto :WinV if /i "%_os%" == "7" goto :Win7 if /i "%_os%" == "8" goto :Win8 if /i "%_os%" == "8.1" goto :Win8.1 echo Windows Version not Supported!  pause  goto :eof  :WinS if /i "%_sp%" == "0" start /wait %~dp0\servicepackSV1.exe if /i "%_sp%" == "1" start /wait %~dp0\servicepackSV2.exe  if /i "%_sp%" == "2" goto :GoodtoGo  echo Service Pack Installed!! goto :eof  :WinV if /i "%_sp%" == "0" start /wait %~dp0\servicepackSV1.exe if /i "%_sp%" == "1" start /wait %~dp0\servicepackSV2.exe  if /i "%_sp%" == "2" goto :GoodtoGo  echo Service Pack Installed!! goto :eof  :Win7 if /i "%_sp%" == "0" start /wait %~dp0\servicepack7.exe  if /i "%_sp%" == "1" goto :GoodtoGo  echo Service Pack Installed!! goto :eof  :Win8 echo No service pack needed! goto :eof  :Win8.1 wmic qfe get hotfixid | find "KB2919355" if %errorlevel%==0 goto :GoodtoGo start /wait %~dp0\win8.exe goto :eof  :GoodtoGo echo The Latest ServicePack is already installed! goto :eof  endlocal 

Заметки:

  • Не полностью протестирован, так как у меня нет всех комбинаций ОС и SP для тестирования.
  • Также gotoбыли исправлены некоторые неверные заявления.

Как насчет 32 и 64 бит. Как я могу определить, какой системой я являюсь?

Используйте следующий пакетный файл (GetBits.cmd):

@echo off setlocal enabledelayedexpansion for /f "usebackq skip=1 tokens=*" %%i in (`wmic OS get OSArchitecture ^| findstr /r /v "^$"`) do ( set "_bits=%%i" ) echo %_bits% endlocal 

Пример вывода:

F:\test>GetBits 64-bit  F:\test> 

Дальнейшее чтение

ДэвидПостилл. Спасибо, я проверю это. John1256 8 лет назад 0
@ John1256 Все работает хорошо? DavidPostill 8 лет назад 0
работает хорошо! :) John1256 8 лет назад 0
Как насчет 32 и 64 бит. Как мы можем определить, на какой системе вы находитесь? John1256 8 лет назад 0
@ John1256 Тебе стоило задать новый вопрос. Тем не менее, я чувствую себя щедрым сегодня утром, поэтому я обновил свой ответ;) DavidPostill 8 лет назад 0