获取Windows版本的batch file

我需要获得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 

问题是当我在Vista或Windows 7上执行此操作时,我收到消息

机器未确定

有什么其他的方式去做我想要的吗?

Solutions Collecting From Web of "获取Windows版本的batch file"

你有没有尝试过使用wmic命令?

试试wmic os get version

这会给你在命令行的版本号,那么你只需要集成到批处理文件。

通过仅解析ver的输出来获得这些信息更容易(也更快):

 @echo off setlocal for /f "tokens=4-5 delims=. " %%i in ('ver') do set VERSION=%%i.%%j 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的等效服务器版本和消费者版本。

这个单行命令已经在Windows XP,7和server 2012上测试过了。
而疯狂的汤姆风向标已经成功地在Windows 10上使用它。

cmd控制台中提取版本xy

 for /f "tokens=4-7 delims=[.] " %i in ('ver') do @(if %i==Version (echo %j.%k) else (echo %i.%j)) 

提取完整版本的xyz

 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% 

请参阅Microsoft Windows版本的完整列表 。 这里是一个摘录:

10.0 Windows 10
6.3 Windows 8.1和Windows server 2012
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

也请投票代理Gibbs和peterbh的答案,因为我的答案是从他们的想法中得到启发。

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

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

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

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

这是我的一个班轮,以确定Windows版本:

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

这将返回Windows版本, XP,Vista,7,并将“ver”的值设置为相等。

实际上,这一个班轮不适用于Windows XP,因为该版本包含字符串中的XP。 而不是你想要的5.1,你会得到[版本5,因为添加了令牌。

我修改了这个命令: for /f "tokens=4-6 delims=[. " %%i in ('ver') do set VERSION=%%i.%%j

这将输出xp系统的版本5,您可以使用它来在批处理文件中标识所述系统。 可悲的是,这意味着命令无法区分32bit64bit版本,因为它不会读取来自5.2的表示64bit XP的.2。

你可以让它指定%%k这个标记,但这样做会使这个脚本不能正确地检测到windows vista,7或8,因为它们的ver字符串中有一个标记较少。 希望这可以帮助!

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

这将返回“Windows 7专业版”,“Windows server 2008 R2标准”,等等,然后你可以结合ver命令来获得确切的版本。

 @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的版本来执行某些命令。

如果你正在寻找只是在一个批处理文件,如Windows 10等显示Windows版本

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

 wmic os get Caption,CSDVersion /value 

这将完成这项工作。

如果需要,第一行强制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