Я не знаю, как соединить эти команды
Я знаю, что могу сделать:
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%
.
Заметки:
Мы не можем использовать регулярные выражения в сравнении строк, они не поддерживаются.
Команда
for
извлекает только 3-ю часть (токен) ОС. Это будет работать для настольных версий (если вы хотите отличить Server 2008 от других версий, вам нужно будет найти другое решение)._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>
Дальнейшее чтение
- Индекс AZ командной строки Windows CMD - Отличный справочник по всем вопросам, связанным с командной строкой Windows.
- findstr - поиск строк в файлах.
- for / f - Циклическая команда против результатов другой команды.
- if - Условно выполнить команду.
- wmic - команда инструментария управления Windows.