La ligne de commande Windows et les fichiers batch
Date de publication : 6 avril 2009
XXV. Des fichiers batch plus puissants : Partie 1 - Branchements et boucles
XXV-A. Branchement conditionnel avec l'instruction "if"
XXV-A-1. Instruction "if exist"
XXV-A-2. Instruction "if defined"
XXV-A-3. Instruction "if errorlevel"
XXV-A-4. Opérateurs de comparaison
XXV-B. La commade "goto"
XXV-B-1. Le label "End of File (:eof) est utilisé pour sortir d'un script
XXV-C.
Boucles avec "if" et "goto"
XXV. Des fichiers batch plus puissants : Partie 1 - Branchements et boucles
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 outils 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 fonctions 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 :
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 :
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 :
if exist unFichier.ext del unFichier.ext
|
Vous pouvez également utiliser un test à la forme négative :
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 :
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 :
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 :
Remarquez que le signe "égale" 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 :
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 :
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 :
...
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 :
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 :
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é.
@ 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 ommis les lignes supplémentaire 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 :
@ echo off
for /l %%X in (1,1,99) do (echo %%X > > E:\count.txt)
|
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