Ответ 1
Вы пытались использовать команды wmic
?
Try
wmic os get version
Это даст вам номер версии в командной строке, тогда вам просто нужно будет интегрироваться в пакетный файл.
Мне нужно получить версию ОС с пакетным файлом. Я видел много примеров онлайн, многие используют что-то вроде этого кода:
@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, я получаю сообщение
Не определено машина
Есть ли другой способ сделать то, что я хочу?
Вы пытались использовать команды wmic
?
Try
wmic os get version
Это даст вам номер версии в командной строке, тогда вам просто нужно будет интегрироваться в пакетный файл.
Намного проще (и быстрее) получить эту информацию, анализируя только вывод 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.
Эти однострочные команды были протестированы на 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 106.3
Windows Server 20126.3
Windows 8.1/!\
6.2
Windows 8/!\
6.1
Windows 7/!\
6.0
Windows Vista5.2
Windows XP x645.1
Windows XP5.0
Windows 20004.10
Windows 98
Пожалуйста, также проголосуйте за ответы от агента Гиббса и Петербха, так как мой ответ основан на их идеях.
Я знаю, что это старый вопрос, но я думал, что они были достаточно полезны для поиска людей.
Этот первый - простой пакетный способ получить правильную версию. Вы можете узнать, является ли это сервером или рабочей станцией (если это важно) в другом процессе. Я просто не нашел времени, чтобы добавить его.
Мы используем эту структуру внутри кода для обеспечения соответствия требованиям. Я уверен, что есть много более изящных способов, но это всегда работает.
:: -------------------------------------
:: 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.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
)
Здесь мой один лайнер для определения версии Windows:
for /f "tokens=1-9" %%a in ('"systeminfo | find /i "OS Name""') do (set ver=%%e & echo %ver%)
Это возвращает версию Windows, то есть XP, Vista, 7 и устанавливает значение "ver" равным тому же...
Собственно, этот 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 должным образом, поскольку в их верной строке меньше одного токена. Надеюсь, это поможет!
Используйте рег-запрос, и вы получите фактическое имя: reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName
Это вернет "Windows 7 Professional", "Windows Server 2008 R2 Standard" и т.д. Затем вы можете объединить команду ver, чтобы получить точную версию.
Вот еще один вариант: некоторые другие решения не работают с 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
Поэтому ответы, которые я здесь читаю, в основном длинные. Кратчайший ответ Алекса работает хорошо, но не так чисто.
Самое приятное то, что в отличие от других, он работает быстро.
Я придумал свой собственный однострочник:
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
@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 в пакетном файле, таком как Windows 10 и т.д.
вы можете просто использовать команду ver
просто введите ver
и будет отображаться версия Windows
wmic os get Caption,CSDVersion /value
Это выполнит задание.
Первая строка заставляет установку консоли 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
Извлечение полной версии 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% можно проверить на точные номера версий.