Eu não sei como juntar esses comandos
I know I can do:
wmic os get Caption
to get the window version and:
wmic os get ServicePackMajorVersion
to get the service pack.
Você pode usar wmic
para recuperar esses valores. No entanto, para usá-los posteriormente em seu arquivo em lote (por exemplo, em uma expressão if
), você precisa armazenar os valores em uma variável de ambiente.
Aqui está um exemplo de como fazer isso:
@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
Agora, temos o sistema operacional armazenado em %_os
e a versão principal do Service Pack armazenada em %_sp%
.
Notas:
-
Não podemos usar expressões regulares em uma comparação de string, elas não são suportadas.
-
O comando
for
recupera apenas a terceira parte (token) do sistema operacional. Isso funcionará para as versões desktop (se você quiser distinguir o Server 2008 de outras versões, precisará encontrar outra solução). -
_os
será definido como um dos seguintes valoresServer
,Vista
,7
,8
ou8.1
, portanto, uma expressão regular não é mais necessária.
Em seguida, precisamos alterar as instruções if
para que elas usem as variáveis armazenadas e executem corretamente as comparações de string.
if /i {Caption}=={Microsoft Windows Server 2008 *} goto :WinS
torna-se:
if /i "%_os%" == "Server" goto :WinS
etc.
Juntando tudo, use o seguinte arquivo em lotes:
@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
Notas:
- Não foi completamente testado, pois não tenho todas as combinações de SO e SP para testá-lo.
- Algumas declarações
goto
quebradas foram corrigidas também.
Que tal 32 e 64 bits. Como posso determinar qual sistema sou?
Use o seguinte arquivo de lote (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
Exemplo de saída:
F:\test>GetBits
64-bit
F:\test>
Leitura Adicional
- Um índice A-Z da linha de comando do Windows CMD - Uma excelente referência para todas as coisas relacionadas à linha do Windows cmd.
- findstr - Pesquise strings em arquivos.
- para / f - Comando Loop contra os resultados de outro comando.
- if - Realize condicionalmente um comando.
- wmic - Comando de instrumentação de gerenciamento do Windows.