Comment déterminer sur quelle version de Windows et/ou cmd.exe un fichier de commandes est exécuté?
Il n'y a pas de cmd /version
que j'ai pu trouver et les résultats de SET dans une session d'invite de commande ne donnent rien d'évidentement unique (entre XP et Win7 de toute façon).
La version de cmd.exe
devrait est en réalité plutôt dénuée de pertinence, sauf si vous essayez d'utiliser des fonctionnalités qui n'existaient pas auparavant (dans command.com
par exemple). Il y a le pseudovariable
%cmdextversion%
qui contient la version des extensions de commande qui est 2 depuis des lustres (au moins de nouveau à NT 4, iirc).
Mais revenons au fait: Exécuter ver
et analyser la chaîne de version pourrait être votre meilleur choix:
for /f "tokens=2 delims=[]" %%x in ('ver') do set WINVER=%%x
set WINVER=%WINVER:Version =%
vous pouvez utiliser le "systeminfo" @ cmd.exe
C:\Users\Tagon8>systeminfo | findstr /B /C:"OS Name" /C:"OS Version"
OS Name: Microsoft Windows 8 Release Preview
OS Version: 6.2.8400 N/A Build 8400
J'ai trouvé un moyen plus court en utilisant ver aussi:
Pourrait être encore plus court:
ver | find "5.1" >nul && goto ver_winxp
J'ai trouvé un moyen plus court en utilisant ver
également:
...
ver | find "5.1"
if %ERRORLEVEL% == 0 goto ver_winxp
...
Cela va trouver XP, remplacez la chaîne par vos versions souhaitées
Tapez "ver" à l'invite de commande.
La prochaine fois, étant donné que ce n'est pas vraiment lié à la programmation mais au serveur ou à l'utilisateur, vous pouvez essayer serverfault.com ou superuser.com.
Quelqu'un aura peut-être besoin de ce qui suit pour déterminer le SKU (Win7). J'utilise une partie de ce script pour sélectionner le système d'exploitation et le code XML appropriés pendant l'exécution de sysprep. J'espère que cela vous aidera!
@echo off
set ver=Unknown
systeminfo > C:\sysinfo
findstr /e /c:"Enterprise " C:\sysinfo 1>nul 2>nul
if %errorlevel% equ 0 set ver=Enterprise
findstr /e /c:"Ultimate " C:\sysinfo 1>nul 2>nul
if %errorlevel% equ 0 set ver=Ultimate
findstr /e /c:"Professional " C:\sysinfo 1>nul 2>nul
if %errorlevel% equ 0 set ver=Professional
findstr /e /c:"Home Premium " C:\sysinfo 1>nul 2>nul
if %errorlevel% equ 0 set ver=Home Premium
findstr /e /c:"Home Basic " C:\sysinfo 1>nul 2>nul
if %errorlevel% equ 0 set ver=Home Basic
del /f /q C:\SP\sysinfo 1>nul 2>nul
Echo Windows 7 %ver%
pause
exit
La commande interne ver
indique le numéro de version de Windows (ce qui aurait pu être appris en tapant help
à l'invite de commande).
Il existe une variable dynamique%CMDEXTVERSION%
, mais elle n’a pas progressé dans plusieurs versions; elle n’est donc utile que pour délimiter entre Windows NT et Windows 2000 et les versions plus récentes . (Merci @Joey, ici .)
Voici un lot pour analyser la sortie de ver pour XP et plus récent, avec l'aimable autorisation de Simon Sheppard :
@echo off
Setlocal
:: Get windows Version numbers
For /f "tokens=2 delims=[]" %%G in ('ver') Do (set _version=%%G)
For /f "tokens=2,3,4 delims=. " %%G in ('echo %_version%') Do (set _major=%%G& set _minor=%%H& set _build=%%I)
Echo Major version: %_major% Minor Version: %_minor%.%_build%
if "%_major%"=="5" goto sub5
if "%_major%"=="6" goto sub6
Echo unsupported version
goto:eof
:sub5
::Winxp or 2003
if "%_minor%"=="2" goto sub_2003
Echo Windows XP [%PROCESSOR_ARCHITECTURE%]
goto:eof
:sub_2003
Echo Windows 2003 or xp 64 bit [%PROCESSOR_ARCHITECTURE%]
goto:eof
:sub6
if "%_minor%"=="1" goto sub7
Echo Windows Vista or Windows 2008 [%PROCESSOR_ARCHITECTURE%]
goto:eof
:sub7
Echo Windows 7 or Windows 2008 R2 [%PROCESSOR_ARCHITECTURE%]
goto:eof
Et voici mon coup de poing assez complet, essentiellement académique, qui renvoie le numéro de version analysé sous forme de variables d'environnement:
@echo off
setlocal
:: from http://ss64.org/viewtopic.php?pid=3136#p3136
::==================================
::variables
if %PROCESSOR_ARCHITECTURE%==x86 set pro_Arch=32 Bit (x86)
if %PROCESSOR_ARCHITECTURE%==AMD64 set pro_Arch=64 Bit (AMD64)
if %PROCESSOR_ARCHITECTURE%==IA64 set pro_Arch=Itanium 64 Bit (IA64)
:Main
call :clean
for /f "tokens=2 delims=[]" %%x in ('ver') do set cmdver=%%x
set cmdver=%cmdver:Version =%
call :parse_cmdver
call :ver%cmdver%
call :Report
goto :End
:clean
:: Ensure we don't inherit values from previous runs
set _verCmd=
set _verMajor=
set _verMinor=
set _verBuild=
set _verWin=
goto :eof
:Parse_cmdver
:: Turn "5.1.2306" string into actionable variables
for /f "tokens=1,2,3* delims=." %%g in ("%cmdver%") do (
set major=%%g
set minor=%%h
set build=%%i
)
goto :eof
:Report
echo.
echo. CMD version is %cmdver%
echo. which probably means %longver% %pro_Arch%
echo.
goto :eof
:Report2
echo. The numbers are stored in the following variables:
echo.
set _ver
goto :eof
::Table of version numbers built from
:: http://en.wikipedia.org/wiki/Microsoft_Windows#Timeline_of_releases
:ver1.01
set longver=Windows 1.01
set shortver=Win101
goto :eof
:ver2.03
set longver=Windows 2.03
set shortver=Win203
goto :eof
:ver2.10
set longver=Windows 2.10
set shortver=Win21
goto :eof
:ver2.11
set longver=Windows 2.11
set shortver=Win211
goto :eof
:ver3.0
set longver=Windows 3.0
set shortver=Win3
goto :eof
:ver3.1
set longver=Windows 3.1, Windows For Workgroups 3.1, or Windows NT 3.1
set shortver=Win31/WFW31/WinNT31
goto :eof
:ver3.11
set longver=Windows For Workgroups 3.11
set shortver=WFW311
goto :eof
:ver3.2
set longver=Windows 3.2 (released in Simplified Chinese only)
set shortver=Win32ch
goto :eof
:ver3.5
set longver=Windows NT 3.5
set shortver=WinNT35
goto :eof
:ver3.51
set longver=Windows NT 3.51
set shortver=WinNT351
goto :eof
:ver4.0.950
set longver=Windows 95
set shortver=Win95
goto :eof
:ver4.0.1381
set longver=Windows NT 4.0
set shortver=WinNT4
goto :eof
:ver4.90.3000
set longver=Windows Me
set shortver=WinMe
goto :eof
:ver4.10.1998
set longver=Windows 98
set shortver=Win98
goto :eof
:ver4.10.2222
set longver=Windows 98 SE
set shortver=Win98SE
goto :eof
:ver5.0.2195
set longver=Windows 2000
set shortver=Win2K
goto :eof
:ver5.1.2600
set longver=Windows XP or Windows Fundamentals for Legacy PCs
set shortver=WinXP/WinFun
goto :eof
:ver5.2.3790
set longver=Windows XP, Windows XP Pro or Windows Server 2003
set shortver=WinXP/WinXP-Pro/Server2003
goto :eof
:ver5.2.4500
set longver=Windows Home Server
set shortver=WinHomeServer
goto :eof
:ver6.0.6002
set longver=Windows Vista or Windows Server 2008
set shortver=Vista/Server2008
goto :eof
:ver6.1.7600
set longver=Windows 7 or Windows Server 2008 R2
set shortver=Win7/Server2008R2
goto :eof
:End
:: return version to calling Shell/script,
:: see http://ss64.com/nt/syntax-functions.html
endlocal & set _verCmd=%cmdver% & set _verMajor=%major% & set _verMinor=%minor% & set _verBuild=%build% & set _verWin=%shortver%
call :Report2 :: comment this line out to suppress extra reporting
Pour trouver la version Windows en utilisant WMIC
, vous pouvez utiliser:
wmic os get version