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

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的等效服务器和消费者版本.

  • 要正确处理Windows XP,您需要修改delim,因为winXP上的"ver"生成"Microsoft Windows XP [Version 5.1.####]",但是在更新版本的Windows上"ver"生成"Microsoft Windows [Version" 6.1.####]".请注意,Windows XP在字符串中有"XP".正确的delims是"delims = [.XP".注意XP之后的空间.这个空间是必需的. (5认同)

oli*_*bre 18

这些单行命令已经在Windows XP,Server 2012,7和10上进行了测试(感谢Mad Tom Vane).

x.ycmd控制台中提取版本

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.z

for /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.0   Windows 10
6.3   Windows Server 2012
6.3   Windows 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 Gibbspeterbh的答案,因为我的答案来自他们的想法.


lia*_*mog 13

你尝试过使用这些wmic命令吗?

尝试 wmic os get version

这将为您提供命令行中的版本号,然后您只需要集成到批处理文件中.

  • 这比说"试运行Ver"更有帮助. (2认同)

RLH*_*RLH 6

我知道这是一个古老的问题,但我认为这些有用,足以让人们搜索.

第一个是获得正确版本的简单批处理方式.您可以在另一个进程中查看它是服务器还是工作站(如果这很重要).我只是没有花时间添加它.

我们在代码中使用此结构以确保符合要求.我确信有更多优雅的方式,但这确实有效.

:: -------------------------------------
:: 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)


Bad*_*ers 5

这是另一种变体:其他一些解决方案不适用于 XP,但这个解决方案可以,并且受到RLH 解决方案的启发。

仅当该脚本检测到您想要的 Windows 版本时才会继续,在本例中我希望我的脚本仅在 win 7 中运行,因此要支持其他 Windows,只需GOTO :NOTTESTEDWINGOTO :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