我需要使用批处理文件获取操作系统版本。我在网上看过很多例子,很多都使用类似这样的代码:
@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
问题是当我在Vista或Windows 7上执行此操作时,我收到消息
机器未确定
还有其他办法可以做我想要的吗?
答案 0 :(得分: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
MSDN文档上的This table哪个版本号对应于哪个Windows产品版本(这是您获取6.1的地方意味着来自Windows 7的信息)。
这种技术的唯一缺点是它无法区分Windows的等效服务器和消费者版本。
答案 1 :(得分: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))
x.y.z
for /f "tokens=4-7 delims=[.] " %i in ('ver') do @(if %i==Version (echo %j.%k.%l) else (echo %i.%j.%k))
%%
而不是单%
@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%
请注意,解压缩的版本号并不总是与Windows名称版本对应。请参阅以下full list of Microsoft Windows versions的摘录。
10.0
Windows 10
6.3
Windows Server 2012
6.3
Windows 8.1/!\
6.2
Windows 8/!\
6.1
Windows 7/!\
6.0
Windows Vista
5.2
Windows XP x64
5.1
Windows XP
5.0
Windows 2000
4.10
Windows 98
请同时对Agent Gibbs和peterbh的答案进行投票,因为我的答案来自他们的想法。
答案 2 :(得分:13)
您是否尝试过使用wmic
命令?
尝试
wmic os get version
这将为您提供命令行中的版本号,然后您只需要集成到批处理文件中。
答案 3 :(得分:5)
我知道这是一个古老的问题,但我认为这些问题足以让人们搜索。
第一个是获得正确版本的简单批处理方式。您可以在另一个进程中查看它是服务器还是工作站(如果这很重要)。我只是没有时间来添加它。
我们在代码中使用此结构以确保符合要求。我确信有更多优雅的方式,但这确实有效。
:: -------------------------------------
:: 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
)
第二个问题不是要求的,但对于有人看来可能有用。
这是一个提供版本信息的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
答案 4 :(得分:3)
这将为xp返回5.1,对于Windows 7将返回6/1
for /f "tokens=4-7 delims=[.] " %%i in ('ver') do (
if %%i == Version set OSVersion=%%j.%%k
if %%i neq Version set OSVersion=%%i.%%j
)
答案 5 :(得分:2)
使用reg查询,您将获得一个实际名称: reg query" HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion" / v ProductName
这将返回" Windows 7 Professional"," Windows Server 2008 R2 Standard"等。然后,您可以与ver命令结合使用以获得准确的版本。
答案 6 :(得分:2)
所以我在这里阅读的答案大多冗长。 Alex给出的最简短的答案很好,但不是那么干净。
最好的部分是,它与其他人不同,它运行速度很快。
我想出了自己的单线纸:
FOR /F "usebackq tokens=3,4,5" %i IN (`REG query "hklm\software\microsoft\windows NT\CurrentVersion" /v ProductName`) DO echo %i %j %k
以上是命令提示符。要使其在批处理文件中起作用,请将所有%替换为 %% ,使其外观如下:
FOR /F "usebackq tokens=3,4,5" %%i IN (`REG query "hklm\software\microsoft\windows NT\CurrentVersion" /v ProductName`) DO echo %%i %%j %%k
在我的计算机上,它仅产生 Windows 10 Pro
答案 7 :(得分:2)
这是另一种变体:其他一些解决方案不适用于XP,这个解决方案确实受到RLH solution的启发。
此脚本仅在检测到您需要的Windows版本时才会继续,在此示例中,我希望我的脚本仅在win 7中运行,因此要支持其他窗口,只需将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
答案 8 :(得分:2)
实际上,由于ver包含字符串中的xp,因此一个衬垫对Windows xp不起作用。而不是你想要的5.1,你会得到[Version.5,因为添加了令牌。
我将命令修改为如下所示:
for /f "tokens=4-6 delims=[. " %%i in ('ver') do set VERSION=%%i.%%j
这将为xp系统输出Version.5,您可以使用它来识别批处理文件中的所述系统。遗憾的是,这意味着该命令无法区分32bit
和64bit
版本,因为它不会从5.2中读取表示64bit
XP的.2。
您可以让它为该标记分配%%k
,但这样做会使该脚本无法正确检测Windows vista,7或8,因为它们的ver字符串中只有一个标记较少。希望这有帮助!
答案 9 :(得分:2)
这是我确定Windows版本的一个班轮:
for /f "tokens=1-9" %%a in ('"systeminfo | find /i "OS Name""') do (set ver=%%e & echo %ver%)
这将返回Windows版本,即。,XP,Vista,7,并将“ver”的值设置为相同...
答案 10 :(得分:1)
@echo off
for /f "tokens=2 delims=:" %%a in ('systeminfo ^| find "OS Name"') do set OS_Name=%%a
for /f "tokens=* delims= " %%a in ("%OS_Name%") do set OS_Name=%%a
for /f "tokens=3 delims= " %%a in ("%OS_Name%") do set OS_Name=%%a
if "%os_name%"=="XP" set version=XP
if "%os_name%"=="7" set version=7
这会将操作系统名称获取为“7”或“XP”
然后你可以在变量中使用它来根据windows的版本执行某些命令。
答案 11 :(得分:1)
如果您只是想在Windows 10等批处理文件中显示Windows版本。
您只需使用ver
命令即可
只需输入ver
,即可显示Windows版本
答案 12 :(得分:1)
wmic os get Caption,CSDVersion /value
这将完成这项工作。
答案 13 :(得分:1)
@olibre建议的提取完整版本x.y.z 似乎最适合我。唯一的附加问题是要考虑除英语以外的其他语言,因为字符串“版本”在本地化的Windows中可能完全不同。 因此,这是在Windows XP,7、8.1和10下使用美国和俄罗斯语言环境测试的批处理文件:
for /f "tokens=4-5 delims= " %%i in ('ver') do (
if "%%j"=="" (set v=%%i) else (set v=%%j)
)
for /f "tokens=1-3 delims=.]" %%i in ("%v%") do (
set OS_VER_MAJOR=%%i
set OS_VER_MINOR=%%j
set OS_BUILD_NUM=%%k
)
echo Detected OS version: %OS_VER_MAJOR%.%OS_VER_MINOR%.%OS_BUILD_NUM%
可以检查%OS_VER_MAJOR%,%OS_VER_MINOR%和%OS_BUILD_NUM%的值以获取确切的版本号。
答案 14 :(得分:0)
如果新构建需要,第一行会强制安装WMI控制台。 WMI始终返回一致的字符串" Version = x.x.xxxx"因此,对于所有Windows版本,令牌解析始终是相同的。
从VER输出中解析在版本信息之前具有可变文本,使得令牌位置随机。分隔符只是' ='和'。'字符。
批量添加允许我轻松检查版本为' 510' (XP)高达' 10000'对于Win10。我没有使用Build值。
Setlocal EnableDelayedExpansion
wmic os get version /value 1>nul 2>nul
if %errorlevel% equ 0 (
for /F "tokens=2,3,4 delims==." %%A In ('wmic os get version /value') Do (
(Set /A "_MAJ=%%A")
(Set /A "_MIN=%%B")
(Set /A "_BLD=%%C")
)
(Set /A "_OSVERSION=!_MAJ!*100")
(Set /A "_OSVERSION+=!_MIN!*10")
)
endlocal
答案 15 :(得分:0)
在较新的版本(从Win 7开始)上,您可以拥有powershell do the job for you.
for /F %%i in ('powershell -command "& {$([System.Environment]::OSVersion.Version.Major),$([System.Environment]::OSVersion.Version.Minor) -join '.' }"') do set VER=%%i
goto %VER%
:6.1
REM specific code for windows 7
:10.0
REM specific code for windows 10
有关版本号,请参见this table
答案 16 :(得分:-1)
C:> cmd
Microsoft Windows [版本10.0.17130.1233]
(c)2018 Microsoft Corporation。保留所有权利。