script para instalar o service pack para a versão correspondente do windows

2

Estou criando um script para instalar o service pack para a versão correspondente do Windows.

Portanto, quero que o script determine a versão do Windows em que estou e o service pack esteja instalado e, em seguida, execute um comando para iniciar o instalador do service pack

Eu sei que posso fazer wmic os get Caption para obter a versão da janela e wmic os get ServicePackMajorVersion para obter o service pack.

E posso fazer start /wait %~dp0\servicepack.exe para iniciar o service pack, mas não sei como reunir esses comandos, por isso, se estiver no Windows 7 sem service pack, ele instalará o service pack do Windows 7, mas se eu estiver no servidor Windows, ele instalará o service pack do servidor Windows. Alguma ideia?

Então eu fiz algumas pesquisas e descobri isso:

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

Eu ainda não testei isso, mas vai funcionar?

    
por John1256 14.04.2016 / 05:32

1 resposta

2

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:

  1. Não podemos usar expressões regulares em uma comparação de string, elas não são suportadas.

  2. 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).

  3. _os será definido como um dos seguintes valores Server , Vista , 7 , 8 ou 8.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

por 15.04.2016 / 11:39