web-dev-qa-db-fra.com

Obtenir la version de Windows dans un fichier de commandes

Je dois obtenir la version du système d'exploitation avec un fichier de commandes. J'ai vu beaucoup d'exemples en ligne, beaucoup utilisent quelque chose comme ce code:

@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

Le problème, c’est quand j’exécute cela sous Vista ou Windows 7 que je reçois le message 

Machine indéterminée

Y a-t-il un autre moyen de faire ce que je veux?

27
Yerko Antonio

Avez-vous essayé d'utiliser les commandes wmic?

Essayez wmic os get version

Cela vous donnera le numéro de version dans une ligne de commande, il vous suffira ensuite de l'intégrer au fichier de commandes.

12
liamog

Il est beaucoup plus facile (et plus rapide) d'obtenir cette information en analysant uniquement la sortie de 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

Ce tableau sur les documents MSDN, le numéro de version correspondant à la version du produit Windows (vous obtenez ici les informations 6.1 de Windows 7).

Le seul inconvénient de cette technique est qu’elle ne peut pas faire la distinction entre le serveur équivalent et les versions grand public de Windows.

47
Jon

Ces commandes d'une ligne ont été testées sous Windows XP, Server 2012, 7 et 10 (merci Mad Tom Vane ).

Extraire la version x.y dans une console cmd

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

Extraire la version complète 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))

Dans un script batch, utilisez %% au lieu de % unique

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

La version n'est pas toujours cohérente avec le numéro de marque

Sachez que le numéro de version extrait ne correspond pas toujours à la publication du nom Windows. Voir ci-dessous un extrait de la liste complète des versions de 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 

Merci également de voter pour les réponses de { Agent Gibbs } _ et peterbh _ car ma réponse est inspirée de leurs idées.

17
olibre

Je sais que c’est une vieille question, mais j’ai pensé que c’était assez utile pour que nous puissions la mettre ici pour les gens qui cherchent.

Ce premier est un moyen simple, batch, d’obtenir la bonne version. Vous pouvez savoir s'il s'agit d'un serveur ou d'un poste de travail (si c'est important) dans un autre processus. Je n'ai simplement pas pris le temps de l'ajouter.

Nous utilisons cette structure dans le code pour assurer la conformité aux exigences. Je suis sûr qu'il y a beaucoup de manières plus gracieuses mais cela fonctionne toujours.

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

Ce deuxième n’est pas ce qui a été demandé, mais il peut être utile pour quelqu'un qui cherche. 

Voici une fonction VBscript qui fournit des informations sur la version, y compris s’il s’agit du serveur (ou du poste de travail).

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

Cela retournera 5.1 pour xp ou 6/1 pour 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

Voici une autre variante: certaines autres solutions ne fonctionnent pas avec XP, celle-ci fonctionne et a été inspirée par solution RLH .

Ce script se poursuivra uniquement s'il détecte la version Windows de votre choix. Dans cet exemple, je souhaite que mon script ne s'exécute que sous Windows 7. Par conséquent, pour prendre en charge d'autres fenêtres, il suffit de changer le GOTO :NOTTESTEDWIN en 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

Utilisez une requête reg et vous obtiendrez un nom réel: Requête reg "HKLM\LOGICIEL\Microsoft\Windows NT\CurrentVersion"/v ProductName

Cela renverrait "Windows 7 Professional", "Windows Server 2008 R2 Standard", etc. Vous pouvez ensuite combiner cette commande avec la commande ver pour obtenir la version exacte.

2
Mike Swanson

En fait, cette doublure ne fonctionne pas pour Windows XP car le ver contient xp dans la chaîne. Au lieu de la version 5.1 que vous voulez, vous obtiendrez [Version.5 en raison du jeton ajouté.

J'ai modifié la commande pour ressembler à ceci: for /f "tokens=4-6 delims=[. " %%i in ('ver') do set VERSION=%%i.%%j

Ceci produira une version 5 pour les systèmes xp que vous pourrez utiliser pour identifier ledit système dans un fichier de commandes. Malheureusement, cela signifie que la commande ne peut pas distinguer 32bit et 64bit build, car elle ne lit pas le .2 à partir de la version 5.2 qui dénote 64bit XP.

Vous pourriez lui demander d'associer ce jeton à %%k, mais cela empêcherait ce script de détecter correctement Windows Vista, 7 ou 8, car ils ont un jeton de moins dans leur chaîne de vérification. J'espère que cela t'aides!

2
Agent Gibbs

Donc, les réponses que je lis ici sont pour la plupart longues. La réponse la plus courte d’Alex fonctionne bien, mais elle n’est pas aussi nette.

La meilleure partie est que contrairement aux autres, cela fonctionne rapidement.

Je suis venu avec mon propre one-liner:

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

Ci-dessus correspond à l'invite de commande. Pour que cela fonctionne dans un fichier de commandes, remplacez tout% par %% pour obtenir le résultat suivant:

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

Sur mon ordinateur, il génère simplement Windows 10 Pro

2
Shraddha Kishan

Voici mon liner pour déterminer la version de Windows:

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

Ceci retourne la version de Windows, i.e., XP, Vista, 7 et définit la valeur de "ver" sur la même valeur.

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

Cela va prendre le nom du système d'exploitation comme "7" ou "XP"

Vous pouvez ensuite l'utiliser dans une variable pour exécuter certaines commandes en fonction de la version de Windows.

1
user3246197
wmic os get Caption,CSDVersion /value

Cela fera le travail.

1
Alex

Si vous souhaitez simplement afficher la version de Windows dans un fichier de traitement par lots tel que Windows 10, etc.

vous pouvez simplement utiliser la commande ver tapez juste ver et la version de Windows sera affichée

1
RN Tech

La première ligne oblige, le cas échéant, l’installation d’une console WMI sur une nouvelle construction . WMI renvoie toujours une chaîne cohérente "Version = x.x.xxxx", de sorte que l’analyse des jetons est toujours la même pour toutes les versions de Windows.

L'analyse de la sortie VER a un texte variable précédant les informations de version, rendant les positions de jeton aléatoires. Les délimiteurs ne sont que les '=' et '.' personnages.

L’ajout de lots me permet de vérifier facilement les versions «510» (XP) jusqu’à «10000» pour Win10. Je n'utilise pas la valeur 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