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?
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.
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.
Ces commandes d'une ligne ont été testées sous Windows XP, Server 2012, 7 et 10 (merci Mad Tom Vane ).
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))
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))
%%
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%
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 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
Merci également de voter pour les réponses de { Agent Gibbs } _ et peterbh _ car ma réponse est inspirée de leurs idées.
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
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
)
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
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.
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!
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
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.
@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.
wmic os get Caption,CSDVersion /value
Cela fera le travail.
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
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