2017-06-09 1 views
1

J'ai un script que j'essaye de créer une fonction pour exécuter quelques commandes selon la version de système.Comment créer une condition dans les fenêtres de traitement par lots?

Pour savoir quelle version de Windows que je fais:

systeminfo | Findstr/B/C: "OS Name"/C: "OS Version"> version.txt 
set version = <version.txt 
del version.txt 
echo% version% #(variable test, ok) 

J'ai besoin la fonction suivante (plus ou moins comme je le ferais dans le lot Linux):

if [echo% version% | Findstr/B/C: "Windows XP"> "0"] { 
echo "Windows XP" 
} 
if [echo% version% | Findstr/B/C: "Windows 7"> "0"] { 
echo "Windows 7" 
} 
if [echo% version% | Findstr/B/C: "Windows 8"> "0"] { 
echo "Windows 8" 
} 
if [echo% version% | Findstr/B/C: "Windows 10"> "0"] { 
echo "Windows 10" 
} 
+1

Il y a littéralement des milliers d'exemples de fichiers de commandes sur tout le web des moyens d'identifier la version Windows . _ (Je suggérerais aussi que votre sera parmi les plus lents parce que la commande systeminfo prend un certain temps à terminer) _. Cela dit, l'identification du système d'exploitation n'est généralement nécessaire que si vous essayez de contrôler/restreindre les commandes. Pourriez-vous s'il vous plaît nous fournir vos intentions une fois que l'OS est identifié afin que nous puissions suggérer les méthodes les plus appropriées. – Compo

+0

J'ai un script pour installer automatiquement certains logiciels, et certains softs ne peuvent être installés que dans une version déterminée de Windows. –

+0

Tout installateur de logiciel décent devrait déjà avoir la capacité de déterminer si les exigences du système sont satisfaites. Un programme 64 bits ne devrait pas pouvoir être installé sur un système d'exploitation 32 bits, un logiciel nécessitant un minimum de Windows 8 ne devrait pas pouvoir être installé sur Windows Vista et ainsi de suite ... Pour tout ce qui n'est pas couvert tout ce que vous devriez besoin de faire est de déterminer si la version est supérieure ou égale à votre minimum, ne pas déterminer le nom du produit. Incidemment, la commande 'ver' obtient la version cmd.exe pas la version du système d'exploitation. – Compo

Répondre

0

Je préfère cette méthode à partir VER command :

@Echo off 
For /f "tokens=4,5,6 delims=[]. " %%G in ('ver') Do (set _major=%%G& set _minor=%%H& set _build=%%I) 

Echo Major version: [%_major%] 
Echo Minor Version: [%_minor%] 
Echo Build: [%_build%] 

GOTO sub%_major%-%_minor% 

:sub6-0 
Echo Windows Vista or Windows 2008 
goto next 

:sub6-1 
Echo Windows 7 or Windows 2008 R2 
goto next 

:sub6-2 
Echo Windows 8 or Windows Server 2012 
goto next 

:sub6-3 
Echo Windows 8.1 or Windows Server 2012 
goto next 

:sub10-0 
:sub10-1 
Echo Windows 10 or Windows 2016 

:next 
Echo Architecture: [%PROCESSOR_ARCHITECTURE%] 
pause 

Ou avec ce lot peut aussi faire l'affaire:

@echo off 
setlocal 
for /f "tokens=4-5 delims=. " %%i in ('ver') do set VERSION=%%i.%%j 
if "%version%" == "5.1"  (set "OS=Windows XP") 
if "%version%" == "5.2"  (set "OS=Windows XP Professional x64 Edition") 
if "%version%" == "6.0"  (set "OS=Windows Vista") 
if "%version%" == "6.1"  (set "OS=Windows 7") 
if "%version%" == "6.2"  (set "OS=Windows 8") 
if "%version%" == "6.3"  (set "OS=Windows 8.1") 
if "%version%" == "10.0" (set "OS=Windows 10") 

echo OS is "%OS%" 
echo The version is "%version%" 
endlocal 
pause 
+0

Je suppose qu'une routine raisonnable devrait pouvoir au moins déterminer s'il s'agit d'un système d'exploitation serveur ou autre. Je dis cela parce que je pensais que "5.2" était valide pour Windows NET Server, Home Server et Server 2003 dans les deux architectures? Comme vous pouvez l'imaginer, une routine destinée à exécuter une commande ne connaissant pas la différence entre Windows XP 64 bits et Windows Server 2003 Datacenter Edition 32 bits pourrait être problématique. – Compo

+0

Ça marche parfaitement, les tanks! –

0

Vous ne pouvez pas exécuter une commande dans une instruction if, vous devez utiliser deux lignes:

ver | find /I "10.0" > nul 
if not errorlevel 1 (
    echo Win10 
) 
ver | find /I "5.1" > nul 
if not errorlevel 1 (
    echo WinXP 
)