2

Я создаю скрипт для установки пакета обновления для соответствующей версии 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 {Caption}=={Microsoft Windows Server 2008 *} goto :WinS
if /i {Caption}=={Microsoft Windows Vista *} goto :WinV
if /i {Caption}=={Microsoft Windows 7 *} goto :Win7
if /i {Caption}=={Microsoft Windows 8 *} goto :Win8
if /i {Caption}=={Microsoft Windows 8.1 *} goto :Win8.1
echo Windows Version not Suported! 
pause 
exit

:WinS
wmic os get ServicePackMajorVersion
if /i {ServicePackMajorVersion}=={0} start /wait %~dp0\servicepackSV1.exe
if /i {ServicePackMajorVersion}=={1} start /wait %~dp0\servicepackSV2.exe 
if /i {ServicePackMajorVersion}=={2} goto :GoodtoGo 
echo Service Pack Installed!!
goto :
:WinV
wmic os get ServicePackMajorVersion
if /i {ServicePackMajorVersion}=={0} start /wait %~dp0\servicepackSV1.exe
if /i {ServicePackMajorVersion}=={1} start /wait %~dp0\servicepackSV2.exe 
if /i {ServicePackMajorVersion}=={2} goto :GoodtoGo 
echo Service Pack Installed!!
goto :
:Win7
wmic os get ServicePackMajorVersion
if /i {ServicePackMajorVersion}=={0} start /wait %~dp0\servicepack7.exe 
if /i {ServicePackMajorVersion}=={1} 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

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

1 ответ1

2

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

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

   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 {Caption}=={Microsoft Windows Server 2008 *} 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>

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .