如何判断一个batch file运行在什么版本的Windows和/或cmd.exe上?

如何确定在哪个版本的Windows和/或cmd.exe上运行batch file?

没有cmd /version ,我已经能够find和在命令提示符会话中SET的结果不给任何明显的独特(无论如何XP和Win7之间)。

cmd.exe的版本实际上应该是相当不相关的,除非您尝试使用以前不存在的功能(例如在command.com中)。 那里是伪变量

 %cmdextversion% 

其中包含已经2年的命令扩展版本(至少回到NT 4,iirc)。

但是,回到关键点:运行ver和解析版本字符串可能是你最好的选择:

 for /f "tokens=2 delims=[]" %%x in ('ver') do set WINVER=%%x set WINVER=%WINVER:Version =% 

你可以使用“systeminfo”@ cmd.exe

 C:\Users\Tagon8>systeminfo | findstr /B /C:"OS Name" /C:"OS Version" OS Name: Microsoft Windows 8 Release Preview OS Version: 6.2.8400 N/A Build 8400 

我发现使用ver的更简单的方法是:

可能会更短:

 ver | find "5.1" >nul && goto ver_winxp 

我发现使用ver的更简单的方法是:

 ... ver | find "5.1" if %ERRORLEVEL% == 0 goto ver_winxp ... 

这将找到XP,用你想要的版本替换字符串

在命令提示符下键入“ver”。

下一次,由于这不是真正的编程相关,但与服务器或用户有关,你可以尝试serverfault.com或superuser.com。

也许有人需要以下来确定SKU(Win7)。 我正在使用一些此脚本在sysprep中选择正确的操作系统和XML。 希望能帮助到你!

 @echo off set ver=Unknown systeminfo > C:\sysinfo findstr /e /c:"Enterprise " C:\sysinfo 1>nul 2>nul if %errorlevel% equ 0 set ver=Enterprise findstr /e /c:"Ultimate " C:\sysinfo 1>nul 2>nul if %errorlevel% equ 0 set ver=Ultimate findstr /e /c:"Professional " C:\sysinfo 1>nul 2>nul if %errorlevel% equ 0 set ver=Professional findstr /e /c:"Home Premium " C:\sysinfo 1>nul 2>nul if %errorlevel% equ 0 set ver=Home Premium findstr /e /c:"Home Basic " C:\sysinfo 1>nul 2>nul if %errorlevel% equ 0 set ver=Home Basic del /f /q C:\SP\sysinfo 1>nul 2>nul Echo Windows 7 %ver% pause exit 

内部命令ver报告Windows版本号(可以通过在命令提示符处键入help来学习)。

有一个动态变量 %CMDEXTVERSION% ,但它在几个版本中没有进展,所以它只能用于描述Windows NT和Windows 2000以及更新的版本 。 (谢谢@Joey, 在这里 )

下面是批量解析XP和更新版本的输出,由Simon Sheppard提供 :

 @echo off Setlocal :: Get windows Version numbers For /f "tokens=2 delims=[]" %%G in ('ver') Do (set _version=%%G) For /f "tokens=2,3,4 delims=. " %%G in ('echo %_version%') Do (set _major=%%G& set _minor=%%H& set _build=%%I) Echo Major version: %_major% Minor Version: %_minor%.%_build% if "%_major%"=="5" goto sub5 if "%_major%"=="6" goto sub6 Echo unsupported version goto:eof :sub5 ::Winxp or 2003 if "%_minor%"=="2" goto sub_2003 Echo Windows XP [%PROCESSOR_ARCHITECTURE%] goto:eof :sub_2003 Echo Windows 2003 or xp 64 bit [%PROCESSOR_ARCHITECTURE%] goto:eof :sub6 if "%_minor%"=="1" goto sub7 Echo Windows Vista or Windows 2008 [%PROCESSOR_ARCHITECTURE%] goto:eof :sub7 Echo Windows 7 or Windows 2008 R2 [%PROCESSOR_ARCHITECTURE%] goto:eof 

这里是我自己的相当完整的,很大程度上学术的,可以将解析的版本号作为环境变量返回:

 @echo off setlocal :: from http://ss64.org/viewtopic.php?pid=3136#p3136 ::================================== ::variables if %PROCESSOR_ARCHITECTURE%==x86 set pro_arch=32 Bit (x86) if %PROCESSOR_ARCHITECTURE%==AMD64 set pro_arch=64 Bit (AMD64) if %PROCESSOR_ARCHITECTURE%==IA64 set pro_arch=Itanium 64 Bit (IA64) :Main call :clean for /f "tokens=2 delims=[]" %%x in ('ver') do set cmdver=%%x set cmdver=%cmdver:Version =% call :parse_cmdver call :ver%cmdver% call :Report goto :End :clean :: Ensure we don't inherit values from previous runs set _verCmd= set _verMajor= set _verMinor= set _verBuild= set _verWin= goto :eof :Parse_cmdver :: Turn "5.1.2306" string into actionable variables for /f "tokens=1,2,3* delims=." %%g in ("%cmdver%") do ( set major=%%g set minor=%%h set build=%%i ) goto :eof :Report echo. echo. CMD version is %cmdver% echo. which probably means %longver% %pro_arch% echo. goto :eof :Report2 echo. The numbers are stored in the following variables: echo. set _ver goto :eof ::Table of version numbers built from :: http://en.wikipedia.org/wiki/Microsoft_Windows#Timeline_of_releases :ver1.01 set longver=Windows 1.01 set shortver=Win101 goto :eof :ver2.03 set longver=Windows 2.03 set shortver=Win203 goto :eof :ver2.10 set longver=Windows 2.10 set shortver=Win21 goto :eof :ver2.11 set longver=Windows 2.11 set shortver=Win211 goto :eof :ver3.0 set longver=Windows 3.0 set shortver=Win3 goto :eof :ver3.1 set longver=Windows 3.1, Windows For Workgroups 3.1, or Windows NT 3.1 set shortver=Win31/WFW31/WinNT31 goto :eof :ver3.11 set longver=Windows For Workgroups 3.11 set shortver=WFW311 goto :eof :ver3.2 set longver=Windows 3.2 (released in Simplified Chinese only) set shortver=Win32ch goto :eof :ver3.5 set longver=Windows NT 3.5 set shortver=WinNT35 goto :eof :ver3.51 set longver=Windows NT 3.51 set shortver=WinNT351 goto :eof :ver4.0.950 set longver=Windows 95 set shortver=Win95 goto :eof :ver4.0.1381 set longver=Windows NT 4.0 set shortver=WinNT4 goto :eof :ver4.90.3000 set longver=Windows Me set shortver=WinMe goto :eof :ver4.10.1998 set longver=Windows 98 set shortver=Win98 goto :eof :ver4.10.2222 set longver=Windows 98 SE set shortver=Win98SE goto :eof :ver5.0.2195 set longver=Windows 2000 set shortver=Win2K goto :eof :ver5.1.2600 set longver=Windows XP or Windows Fundamentals for Legacy PCs set shortver=WinXP/WinFun goto :eof :ver5.2.3790 set longver=Windows XP, Windows XP Pro or Windows server 2003 set shortver=WinXP/WinXP-Pro/server2003 goto :eof :ver5.2.4500 set longver=Windows Home server set shortver=WinHomeserver goto :eof :ver6.0.6002 set longver=Windows Vista or Windows server 2008 set shortver=Vista/server2008 goto :eof :ver6.1.7600 set longver=Windows 7 or Windows server 2008 R2 set shortver=Win7/server2008R2 goto :eof :End :: return version to calling shell/script, :: see http://ss64.com/nt/syntax-functions.html endlocal & set _verCmd=%cmdver% & set _verMajor=%major% & set _verMinor=%minor% & set _verBuild=%build% & set _verWin=%shortver% call :Report2 :: comment this line out to suppress extra reporting