【问题标题】:how to tell what version of windows and/or cmd.exe a batch file is running on?如何判断批处理文件在哪个版本的 Windows 和/或 cmd.exe 上运行?
【发布时间】:2009-11-24 20:31:47
【问题描述】:

如何确定批处理文件在哪个版本的 Windows 和/或 cmd.exe 上运行?

我找不到cmd /version,并且在命令提示符会话中 SET 的结果没有给出任何明显独特的东西(无论如何在 XP 和 Win7 之间)。

【问题讨论】:

  • 来自 MS 的批处理文件,用于 How to determine the OS type in a logon script,仅涵盖 W95、NT、2000、Enterprise NT。
  • 这个来自 SS64 的脚本适用于 W9x 到 XP,但 不是 XPx64 或 Win7 x64 - ss64.com/nt/ver.html
  • reg.exe sn-p 检索版本号:{{{ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentVersion }}}

标签: windows cmd


【解决方案1】:

你可以使用“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

【讨论】:

  • 输出是本地化的,所以在非英文Windows版本中,不会有“OS Name”或“OS Version”
【解决方案2】:

我还发现了一种使用 ver 的更短的方法:

还可以更短:

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

【讨论】:

【解决方案3】:

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 =%

【讨论】:

  • 感谢您为我指明了正确的方向并给了我一个推动的开始。这是一个很大的帮助!
【解决方案4】:

我也找到了使用ver 的更短方法:

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

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

【讨论】:

    【解决方案5】:

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

    下一次,因为这不是真正的编程相关,而是服务器或用户相关,你可以试试 serverfault.com 或 superuser.com。

    【讨论】:

    • 我想到了这一点,但这里的批处理文件问答集合比这些站点中的任何一个都多。脚本不是完全编程,但也不能说完全不是编程。无论如何,感谢您的回答。我知道这很简单。
    • 我不会说批量问题必须立即去 SF 或 SU。他们非常适合这里。
    • 约翰内斯;如果某些东西被标记为“cmd”和“Windows”,我不禁想到 SF 或 SU。 :-)
    【解决方案6】:

    要使用WMIC 查找 Windows 版本,您可以使用:

    wmic os get version
    

    【讨论】:

      【解决方案7】:

      也许有人需要以下内容来确定 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
      

      【讨论】:

      • 感谢您提供可用的脚本,尽管我很担心将任何内容转储到 C: 的根目录,并且会改用 %temp%\sysinfo
      【解决方案8】:

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

      有一个dynamic variable%CMDEXTVERSION%,但它在几个版本中都没有进展,因此它仅用于描述between Windows NT and Windows 2000 and newer。 (感谢@Joey,here。)

      这是为 XP 和更新版本解析 ver 输出的批处理,由 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-09-23
        • 2014-03-14
        • 1970-01-01
        • 2019-12-04
        • 2013-03-08
        • 2018-04-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多