IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

La ligne de commande Windows et les fichiers batch

La ligne de commande Windows et les fichiers batch


précédentsommairesuivant

XXV. Des fichiers batch plus puissants : Partie 1 - Branchements et boucles

Ce chapitre est une traduction de la page http://commandwindows.com/batchfiles-branching.htm dont l'auteur original est Victor Laurie.

Ce chapitre explique les commandes "if...else" et "goto".

Bien que de nombreuses tâches utiles puissent être réalisées avec de simples fichiers batch contenant uniquement quelques lignes, toute la puissance qui est disponible ne peut être exploitée sans l'utilisation des méthodes de branchement, d'itération et de boucle. Ces méthodes font partie des outils utilisés par les programmeurs pour créer des scripts très sophistiqués. Toutefois, les concepts sont en fait assez faciles à comprendre et sont accessibles à ceux qui n'ont pas de connaissances en programmation. Quelques lignes supplémentaires dans un batch en utilisant cet outil peuvent augmenter significativement la puissance et la polyvalence du script. Dans ce chapitre, je vais expliquer les branchements. Dans la deuxième partie, je présenterai les méthodes itératives.

XXV-A. Branchement conditionnel avec l'instruction "if"

Les fichiers batch peuvent prendre des décisions et choisir des actions en fonction de certaines conditions. Pour cela, on utilise des instructions commençant par "if". La signification de base d'une instruction "if" (si) est la suivante :

 
Sélectionnez
IF une condition est vraie ALORS faire une action (SINON, faire une autre action)

La seconde partie de l'instruction (entre parenthèses) est optionnelle. Sinon, si la première condition n'est pas remplie, le système va exécuter la ligne suivante dans le fichier batch. La syntaxe est :

 
Sélectionnez
if (condition) (commande1) else (commande2)

La partie "Else" est facultative. Vous pouvez aussi utiliser la forme "if not" pour tester si une condition est fausse. Notez que "if" teste vrai et faux dans le sens booléen.

XXV-A-1. Instruction "if exist"

Il existe une instruction spéciale "if exist" qui peut être utilisée pour tester l'existence d'un fichier, suivie d'une commande. Voici un exemple :

 
Sélectionnez
if exist unFichier.ext del unFichier.ext

Vous pouvez également utiliser un test à la forme négative :

 
Sélectionnez
if not exist unFichier.ext echo Pas de fichier

XXV-A-2. Instruction "if defined"

Un autre cas spécial est l'instruction "if defined", celle-ci est utilisée pour tester l'existence d'une variable. Par exemple :

 
Sélectionnez
if defined uneVariable uneCommande

Vous pouvez aussi utiliser la forme négative : "if not defined".

XXV-A-3. Instruction "if errorlevel"

L'instruction "if errorlevel" est encore un autre cas spécial, qui est utilisé pour tester le code de sortie de la dernière commande qui a été exécutée. Plusieurs commandes renvoient un code de sortie qui indique l'état de la commande. En général, les commandes renvoient 0 si elles se sont exécutées correctement et 1 si la commande a échoué. Certaines commandes peuvent renvoyer d'autres valeurs de code de retour. Par exemple, la commande Xcopy peut renvoyer cinq codes de sortie différents. Ces codes de sortie sont enregistrés dans une variable spéciale appelée errorlevel. Voici un exemple d'utilisation :

 
Sélectionnez
if errorlevel n uneCommande

où "n" est l'un des codes de sortie (entier) possibles. Notez que la comparaison est effectuée en vérifiant si errorlevel est supérieur ou égal à n. Si vous utilisez "not", la comparaison vérifie si errorlevel est inférieur à n

Tableau I. Comparaison des opérateurs dans l'instruction "if"

Opérateur Signification
EQU égal à
NEQ différent de
LSS Plus petit que (Less Than)
LEQ Inférieur ou égal à (Less or Equal)
GTR Plus grand que (Greater Than).
GEQ Supérieur ou égal à (Greater or Equal)

XXV-A-4. Opérateurs de comparaison

Dans certains cas, la condition à remplir est une comparaison de chaînes de caractères. Par exemple :

 
Sélectionnez
if chaine1 == chaine2

Remarquez que le signe "égal" est écrit en double. La condition est vraie si les deux chaînes de caractères sont strictement identiques, y compris la casse. Pour rendre la comparaison insensible à la casse, utilisez le commutateur "/i". Pour des comparaisons plus générales, utilisez les opérateurs du tableau I. (Les opérateurs sont donnés en majuscules dans le tableau mais ils sont insensibles à la casse). Les comparaisons numériques ne fonctionnent qu'avec des chaînes ne contenant que des chiffres. Sinon, la comparaison est faite alphabétiquement. Par exemple "a" est inférieur à "b". Pour ne pas tenir compte de la casse, utiliser le commutateur "/i". Voici un exemple de commande :

 
Sélectionnez
if /i chaine1 gtr chaine2 uneCommande

Quand vous comparez des variables chaînes de caractères, il est préférable d'entourer le nom de la variable avec des guillemets. Vous pouvez par exemple utiliser :

 
Sélectionnez
if "%1" == uneChaine uneCommande

XXV-B. La commade "goto"

Généralement, l'exécution d'un fichier batch se déroule en exécutant à tour de rôle les commandes ligne par ligne. Cependant, on souhaite souvent exécuter une section particulière du fichier batch et sauter d'autres parties. La possibilité de sauter à une section particulière est fournie par la commande appelée "goto" (en un seul mot). La section de destination possède comme label un nom précédé d'un symbole deux-points (:). Ainsi, le script ressemble à cela :

 
Sélectionnez
...
goto :label
...{quelques commandes}...
:label
...{d'autes commandes}...

A l'exécution les "quelques commandes" seront sautées et les "autres commandes" seront exécutées. Le label peut être situé sur une ligne à n'importe quel endroit du script, y compris avant la commande "goto".

Les commandes "goto" sont souvent utilisées avec les instructions "if". Vous pouvez par exemple utiliser une commande de ce type :

 
Sélectionnez
if (condition) goto :label

XXV-B-1. Le label "End of File (:eof) est utilisé pour sortir d'un script

Il est parfois utile de terminer un script si une certaine condition est remplie (ou non). L'une des façons possibles est d'utiliser le label spécial :eof dans une commande goto. Ce label n'est pas présent dans le fichier. Windows XP et les versions suivantes reconnaissent :eof sans que ce label soit placé explicitement à la fin du fichier batch. Ainsi, si vous avez besoin de tester une condition particulière devant entraîner l'arrêt du script, vous pouvez écrire :

 
Sélectionnez
if (condition) goto :eof

Notez que cela termine le script mais que cela ne ferme pas forcément l'invite de commande.

XXV-C. Boucles avec "if" et "goto"

Une ancienne méthode pour effectuer des tâches répétitives était d'utiliser un compteur, des instructions "if" et la commande "goto". Le compteur détermine combien de fois la tâche doit être répétée, l'instruction "if" détermine le moment où le nombre de répétitions désiré est atteint, et la commande "goto" permet d'exécuter l'action appropriée : soit la tâche à répéter soit quitter. Généralement, il est préférable d'utiliser la méthode plus élégante proposée par la puissante commande "for...in...do". Cette commande est décrite dans le chapitre suivant Toutefois, par souci d'exhaustivité et pour illustrer ce que je vous ai expliqué, je vais donner un exemple qui utilise la méthode avec un compteur.

Le script d'exemple ci-dessous crée des nombres entre 1 et 99 et les enregistre dans un fichier. Ce script utilise la commande "set" pour créer une variable qui sert de compteur pour savoir combien de fois on a bouclé.

 
Sélectionnez
@echo off
set /a counter=0

:numbers
set /a counter=%counter%+1
if %counter% ==100 (goto :eof) else (echo %counter% >> E:\count.txt)
goto :numbers

(Les consignes de meilleure programmation indiquent que la variable %counter% devrait être localisée ou détruite à la fin mais par simplicité, j'ai omis les lignes supplémentaires pour le faire. Tel que c'est écrit, la variable d'environnement va persister jusqu'à ce que l'invite de commande (pas juste le script) soit fermée.

En anticipant un peu, je vous faire remarquer qu'il est possible d'obtenir le résultat du script ci-dessus avec un script de deux lignes utilisant l'instruction "for" décrite au chapitre suivant :

 
Sélectionnez
@echo off
for /l %%X in (1,1,99) do (echo %%X >> E:\count.txt)

précédentsommairesuivant

Copyright traduction ©2009 Thomas Garcia. Aucune reproduction, même partielle, ne peut être faite de cette traduction et de l'ensemble de son contenu : textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 Euros de dommages et intérets.
Copyright site web original : Victor Laurie