Yer*_*nio 27 windows operating-system batch-file
我需要使用批处理文件获取操作系统版本.我在网上看过很多例子,很多都使用类似这样的代码:
@echo off
ver | find "XP" > nul
if %ERRORLEVEL% == 0 goto ver_xp
if not exist %SystemRoot%\system32\systeminfo.exe goto warnthenexit
systeminfo | find "OS Name" > %TEMP%\osname.txt
FOR /F "usebackq delims=: tokens=2" %%i IN (%TEMP%\osname.txt) DO set vers=%%i
echo %vers% | find "Windows 7" > nul
if %ERRORLEVEL% == 0 goto ver_7
echo %vers% | find "Windows Vista" > nul
if %ERRORLEVEL% == 0 goto ver_vista
goto warnthenexit
:ver_7
:Run Windows 7 specific commands here.
echo Windows 7
goto exit
:ver_vista
:Run Windows Vista specific commands here.
echo Windows Vista
goto exit
:ver_xp
:Run Windows XP specific commands here.
echo Windows XP
goto exit
:warnthenexit
echo Machine undetermined.
:exit
Run Code Online (Sandbox Code Playgroud)
问题是当我在Vista或Windows 7上执行此操作时,我收到了消息
机器未定
还有其他方法可以做我想要的吗?
Jon*_*Jon 47
通过仅解析输出来获取此信息更容易(也更快)ver:
@echo off
setlocal
for /f "tokens=4-5 delims=. " %%i in ('ver') do set VERSION=%%i.%%j
if "%version%" == "10.0" echo Windows 10
if "%version%" == "6.3" echo Windows 8.1
if "%version%" == "6.2" echo Windows 8.
if "%version%" == "6.1" echo Windows 7.
if "%version%" == "6.0" echo Windows Vista.
rem etc etc
endlocal
Run Code Online (Sandbox Code Playgroud)
MSDN上的这个表文档哪个版本号对应哪个Windows产品版本(这是您获取6.1的地方意味着来自Windows 7的信息).
这种技术的唯一缺点是它无法区分Windows的等效服务器和消费者版本.
oli*_*bre 18
这些单行命令已经在Windows XP,Server 2012,7和10上进行了测试(感谢Mad Tom Vane).
x.y在cmd控制台中提取版本for /f "tokens=4-7 delims=[.] " %i in ('ver') do @(if %i==Version (echo %j.%k) else (echo %i.%j))
Run Code Online (Sandbox Code Playgroud)
x.y.zfor /f "tokens=4-7 delims=[.] " %i in ('ver') do @(if %i==Version (echo %j.%k.%l) else (echo %i.%j.%k))
Run Code Online (Sandbox Code Playgroud)
%%而不是单个%@echo off
for /f "tokens=4-7 delims=[.] " %%i in ('ver') do (if %%i==Version (set v=%%j.%%k) else (set v=%%i.%%j))
echo %v%
Run Code Online (Sandbox Code Playgroud)
请注意,提取的版本号并不总是与Windows名称版本对应.请参阅以下Microsoft Windows版本完整列表中的摘录.
10.0Windows 10
6.3Windows Server 2012
6.3Windows 8.1 Windows 8 Windows 7 Windows Vista Windows XP x64 Windows XP Windows 2000 Windows 98/!\
6.2/!\
6.1/!\
6.0
5.2
5.1
5.0
4.10
还请来自Agent Gibbs和peterbh的答案,因为我的答案来自他们的想法.
lia*_*mog 13
你尝试过使用这些wmic命令吗?
尝试
wmic os get version
这将为您提供命令行中的版本号,然后您只需要集成到批处理文件中.
我知道这是一个古老的问题,但我认为这些有用,足以让人们搜索.
第一个是获得正确版本的简单批处理方式.您可以在另一个进程中查看它是服务器还是工作站(如果这很重要).我只是没有花时间添加它.
我们在代码中使用此结构以确保符合要求.我确信有更多优雅的方式,但这确实有效.
:: -------------------------------------
:: Check Windows Version
:: 5.0 = W2K
:: 5.1 = XP
:: 5.2 = Server 2K3
:: 6.0 = Vista or Server 2K8
:: 6.1 = Win7 or Server 2K8R2
:: 6.2 = Win8 or Server 2K12
:: 6.3 = Win8.1 or Server 2K12R2
:: 0.0 = Unknown or Unable to determine
:: --------------------------------------
echo OS Detection: Starting
ver | findstr /i "5\.0\."
if %ERRORLEVEL% EQU 0 (
echo OS = Windows 2000
)
ver | findstr /i "5\.1\."
if %ERRORLEVEL% EQU 0 (
echo OS = Windows XP
)
ver | findstr /i "5\.2\."
if %ERRORLEVEL% EQU 0 (
echo OS = Server 2003
)
ver | findstr /i "6\.0\." > nul
if %ERRORLEVEL% EQU 0 (
echo OS = Vista / Server 2008
)
ver | findstr /i "6\.1\." > nul
if %ERRORLEVEL% EQU 0 (
echo OS = Windows 7 / Server 2008R2
)
ver | findstr /i "6\.2\." > nul
if %ERRORLEVEL% EQU 0 (
echo OS = Windows 8 / Server 2012
)
ver | findstr /i "6\.3\." > nul
if %ERRORLEVEL% EQU 0 (
echo OS = Windows 8.1 / Server 2012R2
)
Run Code Online (Sandbox Code Playgroud)
第二个不是被要求的,但它可能对看起来有用的人有用.
这是一个提供版本信息的VBscript函数,包括它是服务器(与工作站).
private function GetOSVer()
dim strOsName: strOsName = ""
dim strOsVer: strOsVer = ""
dim strOsType: strOsType = ""
Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\.\root\cimv2")
Set colOSes = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
For Each objOS in colOSes
strOsName = objOS.Caption
strOsVer = left(objOS.Version, 3)
Select Case strOsVer
case "5.0" 'Windows 2000
if instr(strOsName, "Server") then
strOsType = "W2K Server"
else
strOsType = "W2K Workstation"
end if
case "5.1" 'Windows XP 32bit
strOsType = "XP 32bit"
case "5.2" 'Windows 2003, 2003R2, XP 64bit
if instr(strOsName, "XP") then
strOsType = "XP 64bit"
elseif instr(strOsName, "R2") then
strOsType = "W2K3R2 Server"
else
strOsType = "W2K3 Server"
end if
case "6.0" 'Vista, Server 2008
if instr(strOsName, "Server") then
strOsType = "W2K8 Server"
else
strOsType = "Vista"
end if
case "6.1" 'Server 2008R2, Win7
if instr(strOsName, "Server") then
strOsType = "W2K8R2 Server"
else
strOsType = "Win7"
end if
case "6.2" 'Server 2012, Win8
if instr(strOsName, "Server") then
strOsType = "W2K12 Server"
else
strOsType = "Win8"
end if
case "6.3" 'Server 2012R2, Win8.1
if instr(strOsName, "Server") then
strOsType = "W2K12R2 Server"
else
strOsType = "Win8.1"
end if
case else 'Unknown OS
strOsType = "Unknown"
end select
Next
GetOSVer = strOsType
end Function 'GetOSVer
Run Code Online (Sandbox Code Playgroud)
这是另一种变体:其他一些解决方案不适用于 XP,但这个解决方案可以,并且受到RLH 解决方案的启发。
仅当该脚本检测到您想要的 Windows 版本时才会继续,在本例中我希望我的脚本仅在 win 7 中运行,因此要支持其他 Windows,只需GOTO :NOTTESTEDWIN将GOTO :TESTEDWIN
ver | findstr /i "5\.0\." && (echo Windows 2000 & GOTO :NOTTESTEDWIN)
ver | findstr /i "5\.1\." && (echo Windows XP 32bit & GOTO :NOTTESTEDWIN)
ver | findstr /i "5\.2\." && (echo Windows XP x64 / Windows Server 2003 & GOTO :NOTTESTEDWIN)
ver | findstr /i "6\.0\." > nul && (echo Windows Vista / Server 2008 & GOTO :NOTTESTEDWIN)
ver | findstr /i "6\.1\." > nul && (echo Windows 7 / Server 2008R2 & GOTO :TESTEDWIN)
ver | findstr /i "6\.2\." > nul && (echo Windows 8 / Server 2012 & GOTO :NOTTESTEDWIN)
ver | findstr /i "6\.3\." > nul && (echo Windows 8.1 / Server 2012R2 & GOTO :NOTTESTEDWIN)
ver | findstr /i "10\.0\." > nul && (echo Windows 10 / Server 2016 & GOTO :NOTTESTEDWIN)
echo "Could not detect Windows version! exiting..."
color 4F & pause & exit /B 1
:NOTTESTEDWIN
echo "This is not a supported Windows version"
color 4F & pause & exit /B 1
:TESTEDWIN
REM put your code here
Run Code Online (Sandbox Code Playgroud)
小智 5
所以我在这里读到的答案大多很长。亚历克斯的最短答案效果很好,但不是那么干净。
最好的部分是,与其他的不同,它运行速度很快。
我想出了我自己的一句话:
FOR /F "usebackq tokens=3,4,5" %i IN (`REG query "hklm\software\microsoft\windows NT\CurrentVersion" /v ProductName`) DO echo %i %j %k
Run Code Online (Sandbox Code Playgroud)
以上是命令提示符。要使其在批处理文件中工作,请将所有%替换为%%,使其看起来像:
FOR /F "usebackq tokens=3,4,5" %%i IN (`REG query "hklm\software\microsoft\windows NT\CurrentVersion" /v ProductName`) DO echo %%i %%j %%k
Run Code Online (Sandbox Code Playgroud)
在我的电脑中,它只是生成Windows 10 Pro