как узнать, на какой версии Windows и/или cmd.exe запущен пакетный файл?

Как определить, на какой версии Windows и/или cmd.exe работает пакетный файл?

Нет cmd /version, который мне удалось найти, и результаты SET в сеансе командной строки не дают ничего явно уникального (во всяком случае, между XP и Win7).


person Community    schedule 24.11.2009    source источник
comment
пакетный файл от MS для Как определить тип ОС в сценарии входа, охватывает только W95 ,NT,2000, Предприятие NT.   -  person matt wilkie    schedule 25.11.2009
comment
этот скрипт из SS64 работает от W9x до XP, но не XPx64 или Win7 x64 - ss64.com/nt/ver.html   -  person matt wilkie    schedule 25.11.2009
comment
Фрагмент reg.exe для получения версии #: {{{ reg query HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion /v CurrentVersion }}}   -  person matt wilkie    schedule 25.11.2009


Ответы (8)


Версия 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 =%
person Joey    schedule 24.11.2009
comment
спасибо, что указали мне правильное направление и дали мне толчок. Это была большая помощь! - person matt wilkie; 27.11.2009

вы можете использовать "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
person Community    schedule 24.08.2012
comment
Вывод локализован, поэтому в версиях Windows, отличных от английского, не будет ни имени ОС, ни версии ОС. - person Gabor Csardi; 22.07.2018

Я также нашел более короткий способ, используя ver:

Можно еще короче:

ver | find "5.1" >nul && goto ver_winxp
person Community    schedule 30.04.2014
comment
Спасибо! Было бы лучше добавить это как комментарий к stackoverflow.com/a/11102816/14420, чем создавать новый пост. - person matt wilkie; 02.05.2014

Я также нашел более короткий путь, используя ver:

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

Это найдет XP, замените строку нужными версиями.

person Community    schedule 19.06.2012

Введите «ver» в командной строке.

В следующий раз, поскольку это на самом деле не связано с программированием, а связано с сервером или пользователем, вы можете попробовать serverfault.com или superuser.com.

person Dean J    schedule 24.11.2009
comment
Я думал об этом, но здесь собрана гораздо большая коллекция вопросов и ответов о пакетных файлах, чем на любом из этих сайтов. Скрипты — это не совсем программирование, и все же нельзя сказать, что это совсем не программирование. В любом случае спасибо за ответ. Я знал, что это было что-то простое. - person matt wilkie; 25.11.2009
comment
Я бы не сказал, что пакетные вопросы сразу должны отправляться в SF или SU. Им здесь хорошо. - person Joey; 25.11.2009
comment
Йоханнес; если что-то помечено как cmd и Windows, я не могу не сказать SF или SU. :-) - person Dean J; 25.11.2009

Чтобы найти версию Windows с помощью WMIC, вы можете использовать:

wmic os get version
person Community    schedule 24.11.2018

Может кому понадобится следующее для определения SKU (Win7). Я использую часть этого скрипта, чтобы выбрать правильную ОС и XML во время sysprep. Надеюсь, поможет!

@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
person Community    schedule 01.03.2013
comment
Спасибо за полезный скрипт, хотя я боюсь сбрасывать что-либо в корень C: и вместо этого использовал бы %temp%\sysinfo. - person matt wilkie; 01.03.2013

Внутренняя команда ver сообщает номер версии Windows (который можно узнать, набрав help в командной строке).

Существует динамическая переменная %CMDEXTVERSION%, но она не развивалась в нескольких выпусках, поэтому полезно только для разграничения между Windows NT и Windows 2000 и новее. (Спасибо, @Joey, здесь.)

Вот пакет для анализа вывода версии для XP и новее, любезно предоставленный Саймоном Шеппардом:

@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
person Community    schedule 20.06.2012