29

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

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

机器未定

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

4

19 回答 19

53

通过仅解析以下输出来获取此信息要容易得多(也更快)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 上的此表记录了哪个版本号对应于哪个 Windows 产品版本(这是您从中获取 6.1 表示 Windows 7 信息的地方)。

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

于 2012-11-03T18:19:53.227 回答
21

这些单行命令已经在 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))

提取完整版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 名称版本。请参阅下面的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

还请对特工 Gibbspeterbh的回答进行投票,因为我的回答是从他们的想法中得到启发的。

于 2014-09-22T16:29:23.090 回答
16

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

尝试 wmic os get version

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

于 2012-11-03T18:17:00.770 回答
7

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

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

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

:: -------------------------------------
:: 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
于 2014-04-03T23:54:14.397 回答
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

于 2018-10-21T10:29:34.247 回答
4

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

此脚本仅在检测到所需的 Windows 版本时才会继续,在此示例中,我希望我的脚本仅在 win 7 中运行,因此要支持其他窗口只需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
于 2018-04-19T08:24:41.420 回答
3

这将返回 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
)
于 2014-03-19T21:20:23.963 回答
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”的值设置为相同...

于 2013-05-11T04:40:20.527 回答
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 中读取表示64bitXP 的 .2。

您可以让它分配%%k该令牌,但这样做会使该脚本无法正确检测 Windows Vista、7 或 8,因为它们的 ver 字符串中少了一个令牌。希望这可以帮助!

于 2013-08-08T14:21:50.900 回答
2

使用 reg 查询,您将获得一个实际名称: reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName

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

于 2015-12-22T22:07:32.233 回答
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 的版本执行某些命令。

于 2014-01-28T20:47:51.840 回答
1

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

您可以简单地使用ver只需键入的命令ver,将显示 windows 版本

于 2016-07-02T21:03:28.413 回答
1
wmic os get Caption,CSDVersion /value

这将完成这项工作。

于 2016-12-13T01:40:49.700 回答
1

@olibre 提出的Extract the full version xyz看起来最适合我。唯一额外的事情是考虑除英语以外的其他语言,因为字符串“版本”在本地化的 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% 的值以获得确切的版本号。

于 2019-04-16T10:58:31.347 回答
0

如果新版本需要,第一行会强制安装 WMI 控制台。WMI 始终返回一致的字符串“Version=xxxxxx”,因此所有 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
于 2017-02-08T20:50:46.763 回答
0

在更新的版本(win 7 以上)上,您可以让powershell 为您完成这项工作。

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

有关版本号,请参见此

于 2020-01-28T13:30:32.077 回答
0

以前的答案都不适用于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
于 2021-12-02T15:35:43.397 回答
0

我用这个:

@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 密钥。

最后将全部写入文本文件。

于 2022-02-17T16:23:41.343 回答
-1

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

C:>命令

Microsoft Windows [版本 10.0.17130.1233]

(c) 2018 年微软公司。版权所有。

于 2020-04-08T09:18:23.393 回答