安装相应 Windows 版本服务包的脚本

安装相应 Windows 版本服务包的脚本

我正在创建一个脚本,用于安装相应 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

我不知道如何把这些命令组合在一起

我知道我能做到:

   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命令仅检索操作系统的第三部分(令牌)。这将适用于桌面版本(如果您想区分 Server 2008 与其他版本,则需要寻找其他解决方案)。

  3. _os将被设置为以下值之一ServerVista、、、或7,因此不再需要正则表达式。88.1

接下来我们需要改变if语句,以便它们使用存储的变量并正确执行字符串比较。

if /i {Caption}=={Microsoft Windows Server 2008 *} goto :WinS

变成:

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

ETC。

将它们放在一起,使用以下批处理文件:

@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>

进一步阅读

相关内容