在批处理文件中获取Windows版本

时间:2012-11-03 18:11:00

标签: windows batch-file operating-system

我需要使用批处理文件获取操作系统版本。我在网上看过很多例子,很多都使用类似这样的代码:

@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上执行此操作时,我收到消息

  

机器未确定

还有其他办法可以做我想要的吗?

17 个答案:

答案 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 Gibbspeterbh的答案进行投票,因为我的答案来自他们的想法。

答案 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,您可以使用它来识别批处理文件中的所述系统。遗憾的是,这意味着该命令无法区分32bit64bit版本,因为它不会从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)

只需从命令行启动新的cmd级别即可直接获得版本!

C:> cmd

Microsoft Windows [版本10.0.17130.1233]

(c)2018 Microsoft Corporation。保留所有权利。