我正在创建一个脚本,用于安装相应 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%
。
笔记:
我们不能在字符串比较中使用正则表达式,因为它们不受支持。
该
for
命令仅检索操作系统的第三部分(令牌)。这将适用于桌面版本(如果您想区分 Server 2008 与其他版本,则需要寻找其他解决方案)。_os
将被设置为以下值之一Server
:Vista
、、、或7
,因此不再需要正则表达式。8
8.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>
进一步阅读
- Windows CMD 命令行的 AZ 索引- 与 Windows cmd 行相关的所有事物的绝佳参考。
- 查找字符串- 在文件中搜索字符串。
- 对于/f- 循环命令以执行另一个命令的结果。
- 如果- 有条件地执行命令。
- 西米克- Windows 管理规范命令。