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

16

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

我没有找到任何 cmd /version 命令,而在命令提示符会话中运行 SET 命令得到的结果并没有明显的独特之处(至少在 XP 和 Win7 之间没有)。


MS提供的批处理文件如何在登录脚本中确定操作系统类型,仅适用于W95、NT、2000和企业NT。 - matt wilkie
这个来自SS64的脚本可以在W9x到XP上运行,但是不能在XPx64或Win7 x64上运行 - http://ss64.com/nt/ver.html - matt wilkie
使用reg.exe代码片段来获取版本号: {{{ reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v CurrentVersion }}} - matt wilkie
8个回答

16

你可以使用cmd.exe的"systeminfo"

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名称”或“OS版本”。 - Gabor Csardi

9
我发现了一种使用ver的更短的方法: 可能会更短:
ver | find "5.1" >nul && goto ver_winxp

谢谢!把这个作为评论添加到https://dev59.com/eHI-5IYBdhLWcg3wj5JG#11102816会更好,而不是新建一个帖子。 - matt wilkie

7
< p > cmd.exe 的版本实际上应该是无关紧要的,除非您尝试使用之前不存在的功能(例如在command.com中)。有伪变量。

%cmdextversion%

这个命令扩展的版本一直都是2(至少从NT 4开始),你可以使用ver命令并解析版本字符串来获取信息。

回到重点,运行ver命令并解析版本字符串可能是最好的选择:

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

谢谢您指引我的方向并给我推了一个好的开端。这真的帮了我很大的忙! - matt wilkie

4

在命令提示符处输入“ver”。

下一次,由于这与编程无关,而是与服务器或用户相关,您可以尝试访问serverfault.com或superuser.com。


我曾经考虑过这一点,但是这里有比那些网站更多的批处理文件问答集合。脚本不完全属于编程,但也不能说它们完全不属于编程。无论如何,感谢您的回答。我知道这一定是一些简单的东西。 - matt wilkie
2
我不会说批量问题立即必须发送到SF或SU。它们在这里也很合适。 - Joey
Johannes;如果某些东西被标记为“cmd”和“Windows”,我就会想到SF或SU。 :-) - Dean J

4

我发现了一个更短的方法,也可以使用ver

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

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


2

使用WMIC查找Windows版本,您可以使用以下命令:

wmic os get version

1
也许有人需要以下内容来确定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 代替。 - matt wilkie

0

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

有一个动态变量%CMDEXTVERSION%,但它已经多次发布后没有进展,因此只对区分Windows NT和Windows 2000及更高版本有用。 (感谢@Joey,这里。)

以下是一个批处理程序,用于解析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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接