it-swarm.com.ru

Получить версию Windows в командном файле

Мне нужно получить версию ОС с командным файлом. Я видел много примеров в Интернете, многие используют что-то вроде этого кода:

@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, я получаю сообщение 

Машина не определена

Есть ли другой способ сделать то, что я хочу?

27
Yerko Antonio

Вы пытались использовать команды wmic?

Попробуйте wmic os get version

Это даст вам номер версии в командной строке, тогда вам просто нужно интегрироваться в командный файл.

12
liamog

Намного проще (и быстрее) получить эту информацию, анализируя только вывод ver:

@echo off
setlocal
for /f "tokens=4-5 delims=. " %%i in ('ver') do set VERSION=%%i.%%j
if "%version%" == "10.0" echo Windows 10
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 (именно здесь вы получаете информацию о Windows 7, означающую 6.1).

Единственный недостаток этого метода заключается в том, что он не может различить эквивалентную серверную и потребительскую версии Windows.

47
Jon

Эти однострочные команды были протестированы на Windows XP, Server 2012, 7 и 10 (спасибо Mad Tom Vane ).

Извлечь версию x.y в консоль cmd

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

Распакуйте полную версию x.y.z

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%

Версия не всегда соответствует номеру бренда

Помните, что извлеченный номер версии не всегда соответствует выпуску имени Windows. Ниже приведена выдержка из полного списка версий Microsoft Windows .

10.0 Windows 10
6.3 Windows Server 2012
6.3 Windows 8.1 /!\
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 

Пожалуйста, также проголосуйте за ответы от агента Гиббса и peterbh , так как мой ответ вдохновлен их идеями.

17
olibre

Я знаю, что это старый вопрос, но я подумал, что он достаточно полезен, чтобы поставить его здесь для поиска людей.

Этот первый простой способ получить правильную версию. Вы можете узнать, является ли это Сервером или Рабочей станцией (если это важно) в другом процессе. Я просто не потратил время, чтобы добавить его.

Мы используем эту структуру внутри кода, чтобы обеспечить соответствие требованиям. Я уверен, что есть много более изящных способов, но это всегда работает.

:: -------------------------------------
:: 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
RLH

Это вернет 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
)
3
peterbh

Вот еще один вариант: некоторые другие решения не работают с XP, это работает и было вдохновлено решением RLH .

Этот сценарий будет продолжаться, только если он обнаружит нужную версию Windows, в этом примере я хочу, чтобы мой сценарий запускался только в win 7, поэтому для поддержки других окон просто измените GOTO :NOTTESTEDWIN на GOTO :TESTEDWIN

ver | findstr /i "5\.0\." && (echo Windows 2000 & GOTO :NOTTESTEDWIN)
ver | findstr /i "5\.1\." && (echo Windows XP 32bit & GOTO :NOTTESTEDWIN) 
ver | findstr /i "5\.2\." && (echo Windows XP x64 / Windows Server 2003 & GOTO :NOTTESTEDWIN)
ver | findstr /i "6\.0\." > nul && (echo Windows Vista / Server 2008 & GOTO :NOTTESTEDWIN)
ver | findstr /i "6\.1\." > nul && (echo Windows 7 / Server 2008R2 & GOTO :TESTEDWIN)
ver | findstr /i "6\.2\." > nul && (echo Windows 8 / Server 2012 & GOTO :NOTTESTEDWIN)
ver | findstr /i "6\.3\." > nul && (echo Windows 8.1 / Server 2012R2 & GOTO :NOTTESTEDWIN)
ver | findstr /i "10\.0\." > nul && (echo Windows 10 / Server 2016 & GOTO :NOTTESTEDWIN)

echo "Could not detect Windows version! exiting..."
color 4F & pause & exit /B 1

:NOTTESTEDWIN
echo "This is not a supported Windows version"
color 4F & pause & exit /B 1

:TESTEDWIN
REM put your code here
2
Badr Elmers

Используйте запрос reg, и вы получите реальное имя: Запрос reg "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion"/v ProductName

Это вернет «Windows 7 Professional», «Windows Server 2008 R2 Standard» и т.д. Затем можно объединиться с командой ver, чтобы получить точную версию.

2
Mike Swanson

На самом деле, этот вкладыш не работает для Windows XP, так как версия содержит в строке xp. Вместо 5.1, который вы хотите, вы получите [Version.5 из-за добавленного токена.

Я изменил команду, чтобы она выглядела так: for /f "tokens=4-6 delims=[. " %%i in ('ver') do set VERSION=%%i.%%j

Это выведет Version.5 для систем XP, которые вы можете использовать для идентификации упомянутой системы в командном файле. К сожалению, это означает, что команда не может различить 32bit и 64bit build, поскольку она не читает .2 из 5.2, что обозначает 64bit XP.

Вы могли бы сделать так, чтобы он назначил %%k этот токен, но это сделало бы этот сценарий не соответствующим образом обнаруживающим Windows Vista, 7 или 8, поскольку у них на один токен меньше в строке ver. Надеюсь это поможет!

2
Agent Gibbs

Поэтому ответы, которые я здесь читаю, в основном длинные. Кратчайший ответ Алекса работает хорошо, но не так чисто.

Самое приятное то, что в отличие от других, он работает быстро.

Я придумал свой собственный однострочник:

FOR /F "usebackq tokens=3,4,5" %i IN (`REG query "hklm\software\Microsoft\windows NT\CurrentVersion" /v ProductName`) DO echo %i %j %k

Выше для командной строки. Чтобы он работал в пакетном файле, замените все% на %% , чтобы он выглядел следующим образом:

FOR /F "usebackq tokens=3,4,5" %%i IN (`REG query "hklm\software\Microsoft\windows NT\CurrentVersion" /v ProductName`) DO echo %%i %%j %%k

В моем компьютере он просто производит Windows 10 Pro

2
Shraddha Kishan

Вот мой вкладыш, чтобы определить версию Windows:

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

Это возвращает версию Windows, то есть , XP, Vista, 7, и устанавливает значение "ver" равным тому же ...

2
user1
@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.

1
user3246197
wmic os get Caption,CSDVersion /value

Это сделает работу.

1
Alex

Если вы хотите просто показать версию Windows в пакетном файле, таком как Windows 10 и т.д.

вы можете просто использовать команду ver Просто введите ver и версия Windows будет отображена

1
RN Tech

Первая строка принудительно устанавливает консоль WMI, если это требуется для новой сборки . WMI всегда возвращает непротиворечивую строку «Version = x.x.xxxx», поэтому анализ токена всегда одинаков для всех версий Windows.

Синтаксический анализ из вывода VER имеет переменный текст, предшествующий информации о версии, что делает позиции токенов случайными. Разделителями являются только '=' и '.' персонажи.

Пакетное добавление позволяет мне легко проверять версии от «510» (XP) до «10000» для Win10. Я не использую значение 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
0
Bruce Gavin