Подтвердить что ты не робот

Получить версию 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, я получаю сообщение

Не определено машина

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

4b9b3361

Ответ 1

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

Try wmic os get version

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

Ответ 2

Намного проще (и быстрее) получить эту информацию, анализируя только вывод 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.

Ответ 3

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

Извлечь версию xy в консоли cmd

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

Распакуйте полную версию xyz

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

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

Ответ 4

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

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

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

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

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

Ответ 6

Здесь мой один лайнер для определения версии Windows:

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

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

Ответ 7

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

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

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

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

Ответ 8

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

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

Ответ 9

Вот еще один вариант: некоторые другие решения не работают с 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

Ответ 10

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

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

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

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

Ответ 11

@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"

Затем вы можете использовать это в переменной для выполнения определенных команд на основе версии окон.

Ответ 12

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

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

Ответ 13

wmic os get Caption,CSDVersion /value

Это выполнит задание.

Ответ 14

Первая строка заставляет установку консоли 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

Ответ 15

Извлечение полной версии xyz, предложенной @olibre, выглядит наиболее подходящим для меня. Единственная дополнительная вещь - это учитывать другие языки, кроме английского, так как строка "версия" может полностью отличаться в локализованной Windows. Итак, вот пакетный файл, протестированный под Windows XP, 7, 8.1 и 10, с использованием языка США и России:

for /f "tokens=4-5 delims= " %%i in ('ver') do (
  if "%%j"=="" (set v=%%i) else (set v=%%j)
)
for /f "tokens=1-3 delims=.]" %%i in ("%v%") do (
  set OS_VER_MAJOR=%%i
  set OS_VER_MINOR=%%j
  set OS_BUILD_NUM=%%k
)
echo Detected OS version: %OS_VER_MAJOR%.%OS_VER_MINOR%.%OS_BUILD_NUM%

Значения% OS_VER_MAJOR%,% OS_VER_MINOR% и% OS_BUILD_NUM% можно проверить на точные номера версий.