【问题标题】:Get Windows version in a batch file在批处理文件中获取 Windows 版本
【发布时间】:2012-10-24 02:29:36
【问题描述】:

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

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

机器未确定

还有其他方法可以做我想做的事吗?

【问题讨论】:

  • 我在这里要小心,任何接受升级到 Windows 10 的人都可能有旧版本号,我的机器是 windows 8.1,我升级到 10,它仍然显示 6.3注册表为“CurrentVersion”
  • systeminfo 输出取决于语言,例如在德语中是“Betriebssystemname”

标签: windows batch-file operating-system


【解决方案1】:

仅通过解析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

This table 在 MSDN 文档中哪个版本号对应于哪个 Windows 产品版本(这是您获得 6.1 意味着 Windows 7 信息的地方)。

这种技术的唯一缺点是它无法区分 Windows 的等效服务器版本和消费者版本。

【讨论】:

  • 要正确处理 Windows XP,您需要修改分隔符,因为 winXP 上的“ver”会产生“Microsoft Windows XP [Version 5.1.####]”,但在较新版本的 windows 上会产生“ ver”产生“Microsoft Windows [版本 6.1.####]”。请注意,Windows XP 的字符串中有“XP”。正确的分隔符是“delims=[.XP”。注意 XP 后面的空格。该空间是必需的。
  • 是否将 delims 更改为 "delims=[.XP " 会破坏 Win7/8 检测?我还想加入tokens=4-5吗?正确的代码行是什么?
【解决方案2】:

这些单行命令已在 Windows XP、Server 2012、7 和 10 上测试过(感谢Mad Tom Vane)。

在cmd 控制台中提取版本x.y

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  @@98765438 /strong>
6.1   Windows 7   /!\
6.0   Windows Vista
5.2   Windows XP x64
5.1   Windows XP
@ 987654344@   Windows 2000
4.10   Windows 98

也请对Agent Gibbs 和peterbh 的回答进行投票,因为我的回答灵感来自他们的想法。

【讨论】:

  • 对于 W10,我喜欢获得整个版本。谢谢你。你的答案就是我想要的。 for /f "tokens=4-7 delims=[.] " %i in ('ver') do @(if %i==Version (echo %j.%k.%l) else (echo %i.%j.%k))
【解决方案3】:

您是否尝试过使用wmic 命令?

试试 wmic os get version

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

【讨论】:

  • 这并没有比说“尝试运行 Ver”更有帮助。
  • WMIC 仅在第一次运行时需要管理员。
  • 这么久了,但是我收到此命令的错误,wmic cli 正在打开。错误中没有显示任何内容。我使用的是 Windows 8.1
【解决方案4】:

我知道这是一个老问题,但我认为这些足够有用,可以放在此处供人们搜索。

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

我们在代码中使用这种结构来确保符合要求。我相信还有很多更优雅的方法,但这总是有效的。

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

【讨论】:

    【解决方案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
    

    以上是命令提示符。要使其在批处理文件中工作,请将所有 % 替换为 %% 以使其看起来像:

    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

    【讨论】:

    • 谢谢!这比我能找到的大多数解决方案要好得多!它可能应该打印更多的标记(例如 3,4,5 到 3,4,5,6,7 和 %%i %%j %%k 到 %%i %%j %%k %%l %%m ) 例如显示 Windows 10 Enterprise LTSC 2019 而不仅仅是 Windows 10 Enterprise
    【解决方案6】:

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

    只有在检测到您想要的 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
    

    【讨论】:

    • 最好将ver 的输出保存到一个变量中,然后通过findstr 回显,而不是调用ver 8 次。
    • @Ryan Beesley ver 是内置命令而不是外部命令,因此它采用与使用 echo 相同的方式;为了简单起见,我更喜欢这样,而不是使用长 for... 解决方案来保存 ver 结果。
    • 这是一个有效的观点。我不知道该命令是否内置了该信息,我怀疑它仍在查看注册表或内部数据结构以生成输出,所以我仍然认为缓存它更干净,但它没有运行外部命令的开销可能。
    【解决方案7】:

    这将返回 5.1 用于 xp 或 6/1 用于 Windows 7

    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
    )
    

    【讨论】:

      【解决方案8】:

      这是我确定 Windows 版本的唯一方法:

      for /f "tokens=1-9" %%a in ('"systeminfo | find /i "OS Name""') do (set ver=%%e & echo %ver%)
      

      这将返回 windows 版本,即、XP、Vista、7,并将“ver”的值设置为相同...

      【讨论】:

      • 此方法不使用this table指定的微软官方版本
      【解决方案9】:

      实际上,一个衬里不适用于 windows xp,因为 ver 在字符串中包含 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 字符串中少了一个令牌。希望这会有所帮助!

      【讨论】:

        【解决方案10】:

        使用 reg 查询,你会得到一个真实的名字: reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName

        这将返回“Windows 7 Professional”、“Windows Server 2008 R2 Standard”等。然后您可以结合 ver 命令来获取确切的版本。

        【讨论】:

          【解决方案11】:
          @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的版本执行某些命令。

          【讨论】:

            【解决方案12】:

            如果您只想在批处理文件中显示 Windows 版本,例如 Windows 10 等。

            您可以简单地使用ver 命令 只需输入ver,就会显示windows版本

            【讨论】:

            • ver 在 OP 问题的第三行。请阅读问题,而不仅仅是标题。
            【解决方案13】:
            wmic os get Caption,CSDVersion /value
            

            这样就可以了。

            【讨论】:

            • wmic os get Caption,OSArchitecture,Version 非常简洁。谢谢!
            【解决方案14】:

            @olibre 提出的 Extract the full version 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% 的值以获得确切的版本号。

            【讨论】:

              【解决方案15】:

              如果新版本需要,第一行会强制安装 WMI 控制台。 WMI 始终返回一致的字符串“Version=x.x.xxxx”,因此所有 Windows 版本的令牌解析始终相同。

              从 VER 输出解析在版本信息之前有可变文本,使标记位置随机。分隔符只有 '=' 和 '.'字符。

              批量添加让我可以轻松地检查 Win10 的版本为“510”(XP)到“10000”。我不使用 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
              

              【讨论】:

                【解决方案16】:

                在更新的版本(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

                【讨论】:

                  【解决方案17】:

                  以前的答案都不适用于 Win9x,并且很快就会因 w10 22h1 而失败。 前 4 行与 win3.x 兼容(“set /P”;“for /F”在那里是非法的)。 然后它将版本保存在 wver var 上,用于比较:搜索字符串的前导空格对于捕获 ver 字符串中数字的开头至关重要(即:“4.”匹配 w10 21h2 字符串:“Microsoft Windows [Version 10.0 .19044.1348]")。大多数以前的解决方案很快就会在 [future] windows 版本中失败。下一个 w10 22h1 字符串将是:“Microsoft Windows [Version 10.0.19045.1xxx]”,它将匹配“5.1”XP 搜索字符串。

                  @echo off
                  ver | find " 3." >nul
                  if not ERRORLEVEL 1 goto :wold
                  ver | find " 4." >nul
                  if not ERRORLEVEL 1 goto :wold
                      rem put version on wver variable
                      for /F "delims=" %%a in ('ver') do set wver=%%a
                      echo Windows Version: %wver%
                      rem Do all >= w2000/xp tasks here
                    if not "%wver: 5.=%" == "%wver%" ( echo 5.0=2k 5.1=xp 5.2=xp64/2k3 & goto fin )
                      rem Do all >= vista tasks here
                    if not "%wver: 6.0=%" == "%wver%" ( echo vista/2k8 & goto fin )
                      rem Do all >= w7 tasks here
                    if not "%wver: 6.1=%" == "%wver%" ( echo w7/2k8r2 & goto fin )
                      rem Do all >= w8 tasks here
                    if not "%wver: 6.=%" == "%wver%" ( echo 6.2=w8/2012 6.3=w8.1/2012r2 & goto fin )
                      rem Do all >= w10 tasks here
                    if not "%wver: 10.=%" == "%wver%" ( echo w10.x & goto fin )
                      rem Do all >= w11 tasks here
                    if not "%wver: 11.=%" == "%wver%" ( echo w11.x & goto fin )
                      rem Do all >= w12? tasks here
                    goto fin
                  :wold
                  echo Unsupported windows 3.x 9x me nt3 nt4...
                  :fin
                  

                  【讨论】:

                  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center。
                  【解决方案18】:

                  我用这个:

                  @echo off & @echo.
                  setlocal
                  @echo Getting Windows version... & @echo.
                  @echo. > Windows_version_and_Key.txt
                  @echo Windows Version: >> Windows_version_and_Key.txt
                  for /f "tokens=* delims=. " %%i in ('ver') do set VERSION=%%i
                  @echo %VERSION% >> Windows_version_and_Key.txt
                  @echo. >> Windows_version_and_Key.txt
                  @echo. >> Windows_version_and_Key.txt
                  wmic os get Caption >> Windows_version_and_Key.txt
                  @echo. >> Windows_version_and_Key.txt
                  @echo Getting Windows license KEY...
                  @echo License KEY: >> Windows_version_and_Key.txt
                  wmic path softwarelicensingservice get OA3xOriginalProductKey >> Windows_version_and_Key.txt
                  powershell -c "(Get-Content .\Windows_version_and_Key.txt) -replace '\x00+', '' | Set-Content .\Windows_version_and_Key.txt"
                  type Windows_version_and_Key.txt
                  @echo. & @echo. & @echo Done! Press any key to Exit!
                  endlocal
                  pause
                  exit
                  

                  它会为您提供 Windows 密钥,以防万一您丢失并需要它。

                  最后全部写入文本文件。

                  【讨论】:

                    【解决方案19】:

                    只需从命令行启动一个新的 cmd 级别即可直接为您提供版本!

                    C:> cmd

                    Microsoft Windows [版本 10.0.17130.1233]

                    (c) 2018 年微软公司。保留所有权利。

                    【讨论】:

                      猜你喜欢
                      • 2013-07-16
                      • 2015-12-11
                      • 1970-01-01
                      • 2021-01-16
                      • 2017-07-24
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多