Support cours batch - L`informatique, c`est mon domaine
Transcription
Support cours batch - L`informatique, c`est mon domaine
11. LE TRAITEMENT BATCH Objectifs : dans ce chapitre vous apprendrez ce qui suit : 1. Les principes et les avantages du traitement batch 2. Comment utiliser les paramètres sur la ligne de commande et ceux de l'environnement 3. Comment utiliser l'instr uction IF 4. Ce qu'est le ERRORLEVEL et comment on s'en sert 1. Principes du traitement batch 1.1. Le traitement batch (ou traitement par lots) offre la possibilité de faire exécuter à l'ordinateur une suite de commandes sans qu'il y ait intervention de l'homme entre une commande et la suivante. Le traitement batch peut ainsi être employé pour les situations suivantes : l Sauvegardes l Gestion des répertoires l Définition de l'environnement de travail l Menus pour l'utilisateur Il est important de noter que sous Windows NT et Windows 2000 plusieurs opérations peuvent être automatisées via des programmes batch dont la structure est identique à celle des batch du MS -DOS. 1.2. Ordre de traitement: macro, commande interne, COM, EXE, BAT Si vous avez plusieurs programmes portant le même nom, MS-DOS effectue sa recherche dans un ordre bien précis. MS-DOS recherche en premier lieu : • les macros définies par DOSKEY et les exécute. • S'il ne trouve aucune de ces macros, MS-DOS recherche la présence d'une commande interne comportant ce mot. • Ensuite, il cherche une commande externe (un programme de suffixe .COM) dans le répertoire courant, puis un programme .EXE portant le nom demandé. • Enfin un fichier BATCH. • La recherche se poursuit ensuite dans tous les répertoires portés sur le chemin d'accès PATH, la hiérarchie COM, EXE et BAT étant toujours respectée 1.3. MS-DOS permet d'éviter le problème des programmes portant le nom d'un fichier .BAT: il suffit de taper le nom complet du fichier, suffixe compris. Si vous avez créé un fichier batch FORMAT.BAT, vous éviterez que MS-DOS lance la commande FORMAT.COM en tapant: FORMAT.BAT (au complet...) Remarquez ici que cela ne fonctionne pas avec le nom des commandes internes. Si vous nommez un fichier batch DIR.BAT, MS-DOS lancera toujours la commande DIR, même si vous avez défini une macro du nom de DIR. 1.4. Création d'un programme batch : la création d'un fichier batch est une opération assez simple si l'on prend le temps de planifier l'opération. En effet, il faut garder à l'esprit que concevoir un bon u n programme batch veut dire avoir auparavant bien compris ce que l'on veut que le programme fasse. Une fois que l'on sait ce que l'on veut et dans quel ordre on le veut, on passe à la réalisation proprement dite qui peut être subdivisée en quatre étapes : l Création, avec un éditeur de textes, d'un fichier dont l'extension est BAT (obligatoirement). l Remplissage du fichier avec les ordres que l'on souhaite exécuter. l Sauvegarde du fichier. 11. Le traitement batch Page 1 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 l Lancement du programme batch, test et correction des éventuelles erreurs . La figure 11.1 montre un exemple de programme batch. @echo off cls echo. echo Pesez une touche pour visualiser le contenu du répertoire... pause > nul dir /p echo La liste est terminée. Pesez une touche pour sortir... pause > nul FIG 11.1 : un simple fichier batch Observons la figure 11.1. Elle contient plusieurs éléments intéressants: l @echo off : cet ordre dit au DOS d'exécuter les instructions qui suivront sans cependant afficher à l'écran, en plus du résultat produit par l'instruction, le nom de l'instruction elle-même. Le caractère @ ordonne de cacher le echo off lui-même lors de son exécution. l echo. : cette instruction (notez le . qui suit le echo) permet d'a fficher une ligne vide. Notez que le point doit suivre immédiatement le ECHO, sinon l'instruction aura un effet totalement différent de celui attendu. l echo <message> : si l'on fait suivre un texte à ECHO, l'instruction affichera le texte. l Pause > nul : le signe > signifie re-direction; cela veut dire que l'on envoie le résultat d'une commande vers un autre endroit que l'endroit habituel. La commande PAUSE affiche d'office le message "Pesez une touche pour continuer...". Ici nous ne voulons pas que le messag e "par défaut" soit affiché et donc nous réacheminons l'output habituel du PAUSE vers le fichier "bidon" prédéfini NUL. 1.5. Exécution : un fichier batch s'exécute comme tout fichier exécutable. 2. L'instruction FOR 2.1. L'instruction FOR sert à exécuter une instruction pour un certain jeu de fichiers. Supposons que l'on souhaite afficher le contenu d'un certain nombre de fichiers texte du répertoire courant et dont l'extension est TXT. L'instruction FOR nous vient en aide (l'instruction est donnée sur la ligne de commande) : l for %i in (*.TXT) do type %i Pour aussi bizarre qu'elle puisse paraître, cette instruction est très simple. En voici l'examen détaillé : l for : en anglais signifie pour. l %i : il s'agit d'une variable qui est créée à l'instant même de l'exécution de la boucle. Le nom de la variable doit être composé d'une seule et unique lettre précédée du signe % (pourcentage). l in (*.TXT) : on spécifie ici une condition: examine uniquement les fichiers dont l'extension est TXT. l do : en anglais signifie faire. l type %i : cette instruction ordonne au MS-DOS d'afficher (type) le contenu du fichier dont le nom est actuellement contenu dans la variable %i. L'instruction for signifie alors : l Considère tous les fichiers du répertoire courant qui ont l'extension égale à TXT. l Pour chacun de ces fichiers, fait ce qui est indiqué après le DO : affiche son contenu. 11. Le traitement batch Page 2 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 La figure 11.2 nous montre un fichier batch exemple qui utilise la commande FOR pour afficher à l'écran les noms des fichiers qui se trouvent sur le disque local. @echo off cls for %%i in (*.*) do echo %%i >> LISTE echo L'opération est terminée. Pesez une touche... pause > nul FIG 11.2 : exemple de programme batch qui utilise l'instruction FOR Observons la figure 11.2 et remarquons les points suivants : l for %%i in (*.*) : lorsqu'on utilise le FOR dans un programme batch, il faut mettre deux signes de %% avant la variable. l echo %%i >> LISTE : cette instruction ordonne d'écrire dans le fichier LISTE les noms des fichiers qui sont examinés dans la boucle. Les signes >> sont ici nécessaires, car on veut que chaque nouveau nom soit ajouté à la fin de la liste; en effet, si on avait employer un seul > on aurait trouvé dans le fichier LISTE un seul nom de fichier, le dernier. 3. Les paramètres sur la ligne de commande 3.1. Le paramètre : Passer des paramètres à un programme signifie le rendre capable de fonctionner avec des données différentes à chaque lancement, donc vraiment utile. Dans la programmation batch existe la possibilité de spécifier des paramètres sur la ligne de commande. Ces paramètres seront spécifiés sous forme de chaînes de caractères et seront traités dans le batch via des variables %N, où N représente une valeur comprise entre 0 et 9. Notons les points suivants : l %0 : ce paramètre contient le nom du programme batch lui-même. l %1..%9 : sont les paramètres qui peuvent être passés sur la ligne de commande. 3.2. Quelques exemples l Premier exemple : la figure 11.3 nous montre un programme batch dont le nom est AFFICHE.BAT. Ce programme affiche le contenu du fichier dont le nom est spécifié au lancement sur la ligne de commande. Au lancement, donc, nous pouvons spécifier ce qui suit : AFFICHE TITI.TXT (TITI.TXT est un fichier du répertoire courant). TITI.TXT est le paramètre sur la ligne de commande. @echo off cls type %1 echo L'affichage est terminé. Appuyez sur une touche. Pause > nul FIG 11.3 : un programme batch qui utilise les paramètres sur la ligne de commande Dans ce programme on remarque surtout le %1 qui suit le verbe TYPE. Que signifie ce %1 ? C'est simple : sur la ligne de commande on a spécifié TITI.TXT; ce TITI.TXT remplace le %1 dans le programme batch (il peut être adressé dans le fichier AFFICHE.BAT grâce à la variable %1). 11. Le traitement batch Page 3 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 l Deuxième exemple : considérons la figure 11.4 (a). Elle nous montre un programme batch qui utilise plusieurs paramètres sur la ligne de commande. Supposons que le programme s'appelle PLURI.BAT. Le programme PLURI.BAT Lancement de PLURI.BAT @echo off PLURI Fichier1 Fichier2 Fichier3 Fichier4 Fichier5 Fichier6 type %1 echo %2 >> LISTE del %3 attrib +r %4 copy %5 %6 (a) (b) FIG 11.4 : un programme batch qui utilise plusieurs paramètres sur la ligne de commande Observons la figure 11.4 (b). Lors du lancement du programme on spécifie les 6 paramètres indiqués comme FichierX. La figure 11.5 nous montre ce qui se passe avec ces 6 paramètres. Le programme PLURI.BAT PLURI Fichier1 Fichier2 Fichier3 Fichier4 Fichier5 Fichier6 @echo off type %1 echo %2 >> LISTE del %3 attrib +r %4 copy %5 %6 FIG 11.5 : ce qui se passe avec les paramètres du programme PLURI.BAT On voit clairement que les 6 paramètres seront ainsi traités : • Fichier1 : on affichera son contenu. • Fichier2 : on écrira son nom dans le fichier LISTE (on l'ajoute à ce que LISTE contient déjà). • Fichier3 : on l'efface. • Fichier4 : on met l'attribut Read Only à ce fichier. • Fichier5 : il sera copié sur Fichier6. • Fichier6 : il recevra le contenu de Fichier5. 4. Les paramètres d'environnement 4.1. Dans le MS-DOS on peut créer des variables d'environnement, c'est-à-dire des variables globales qui peuvent être employées par n'importe quelle application. La création d'une variable d'environnement se fait grâce à la commande SET. La figure 11.6 nous montre des instructions qui créent deux variables d'environnement auxquelles sont assignées les valeurs indiquées. La variable d'environnement LIB (à laquelle on assigne la valeur C:\PASCAL\LIBRARY) sera très probablement employée par le compilateur Pascal pour savoir où aller chercher les librairies dont il aura besoin. De la même manière, la variable MODE MONOPOSTE pourrait être employée par une application pour savoir si l'ordinateur a été mis en réseau ou s'il est encore en monoposte. 11. Le traitement batch Page 4 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 set LIB=C:\PASCAL\LIBRARY set MODE MONOPOSTE=OUI FIG 11.6 : création de deux variables d'environnement 4.2. Un exemple : dans un programme batch, les variables d'environnement peuvent être initialisées, détruites ou testées (on verra les tests plus loin dans ce chapitre). La figure 11.7 nous montre un programme exemple qui crée une variable d'environnement, puis l'initialise, puis change sa valeur et enfin la détruit. @echo off set VAR1=Valeur-1 set VAR1=Valeur-2 set VAR1= FIG 11.7 : batch qui crée, modifie, puis détruit une variable d'environnement l Quelques lignes du programme méritent une explication : • set VAR1=Valeur-1 : cette instruction crée la variable d'environnement VAR1 et lui affecte la valeur Valeur-1. Il est important de noter qu'une variable d'environnement doit être initialisée au moment de la création. • set VAR1=Valeur-2 : cette instruction assigne la valeur Valeur -2 à la variable VAR1. • set VAR1= : cette instruction aura pour effet de détruire la variable d'environnement VAR1. 5. L'étiquette 5.1. Un programme est une suite d'instructions qui s'exécutent les unes après les autres, séquentiellement. Cet ordre d'exécution n'est pas toujours souhaitable, car parfois on veut que certaines part ies du programme s'exécutent seulement si certaines conditions se vérifient; en d'autres termes, on veut altérer l'exécution séquentielle des instructions pour faire "sauter" le contrôle ailleurs que dans la prochaine instruction, par exemple deux ou trois instructions plus loin. Schématiquement cela se représente comme l'indique la figure 11.8(a) et 11.8(b). Si A = B alors va à POINT-1 Instruction-1 A=B? Instruction-2 Non Oui Va à FIN :POINT-1 POINT-1 et FIN sont deux points de repère, ou étiquette Instruction-3 Instruction-4 :FIN Instruction-1 Instruction-3 Instruction-2 Instruction-4 (a) (b) FIG 11.8 : le choix dans le cadre d'un programme batch l Observons les figures 11.8 (a) et 11.8(b). Remarquons les points suivants : 11. Le traitement batch Page 5 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 • On vérifie si A = B; si la réponse est positive, on exécute les instructions 3 et 4; si au contraire A ≠ B, alors on exécute les instructions 1 et 2. • Il est très important de remarquer que lorsque la branche du NON est exécutée (instruc tions 1 et 2), le programme continuerait son exécution normale si on ne lui disait pas de passer à la FIN. De même manière, lorsque la condition est vraie (A = B) il faut expliquer au programme où aller pour reprendre l'exécution : ici on a décidé de l'envoyer à l'étiquette POINT-1. • Les mots FIN et POINT-1 sont des étiquettes; par étiquette on entend un point de repère vers lequel on peut envoyer le contrôle du programme. Une fois que le contrôle passe à une étiquette, l'exécution poursuit à partir du point de repère (l'étiquette) séquentiellement, vers le bas. • Le nom de l'étiquette doit être formulé de manière à ce qu'il respecte la syntaxe imposée par le MS -DOS. • Le nom d'une étiquette devra toujours être précédé du symbole : (deux points). 6. L'instruction IF 6.1. Comme tout langage de programmation, le MS-DOS permet l'emploi du IF pour effectuer des choix. Les tests effectués dans le IF portent essentiellement sur trois éléments : l Les paramètres de la ligne de commande. l Les variables d'environnement. l Le ERRORLEVEL (ou code de sortie) renvoyé par un programme. Dans ce paragraphe on examine les deux premiers; le troisième sera examiné dans le paragraphe suivant. 6.2. Les paramètres sur la ligne de commande : tester ces paramètres est une opération très courante dans le cadre de la programmation batch. En effet, on voit souvent des programmes batch qui exigent qu'au lancement on leur fournisse des paramètres qui indiquent le lecteur cible de l'installation, ou le nom du fichier à traiter, ou le nom du répertoire à créer et ainsi de suite. La figure 11.9 montre comment sont effectués les tests sur les paramètres de la ligne de commande. if '%X' == 'Valeur' Instruction if not '%X' == 'Valeur' Instruction FIG 11.9 : le test des paramètres sur la ligne de commande Examinons la figure 11.9 et remarquons ce qui suit : l X : doit être remplacé par un nombre compris entre 1 et 9. l Valeur : est une valeur numérique ou alphanumérique. Veuillez noter l'emploi du == (double signe égal) pour le test. l Il est conseillé de traiter les paramètres %1, %2... ainsi que les valeurs de comparaison comme d es chaînes de caractères, en les entourant d'apostrophes. Cette astuce évitera des messages du type "erreur de syntaxe" lorsque l'utilisateur appellera le programme batch sans passer aucun paramètre sur la ligne de commande. 11. Le traitement batch Page 6 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 La figure 11.10 nous montre un exemple de programme batch complexe qui teste des paramètres passés sur la ligne de commande par l'utilisateur. 1 @echo off 2 if '%1'=='' goto ERROR 3 tasm %1 /n 4 tlink %1 5 goto FIN 6 :ERROR 7 cls 8 echo Spécifiez un nom de programme ASM à compiler. 9 echo Voici la liste des sour ces actuellement disponibles 10 echo --------------------------------------------------- 11 for %%i in (*.asm) do echo %%i 12 :FIN FIG 11.10 : un programme batch qui teste des paramètres passés sur la ligne de commande Le programme de la figure 11.10 permet la compilation d'un programme assembleur. Il exige que l'utilisateur spécifie le nom du fichier source sur la ligne de commande. Observons les points suivants : l Le programme vérifie que l'utilisateur ait introduit un paramètre sur la ligne de commande ( ligne 2). Si tel n'est pas le cas, le programme passe le contrôle à l'étiquette ERREUR ( ligne 6). Le renvoi à l'étiquette s'effectue à l'aide de l'instruction GOTO. l Si l'utilisateur passe le nom du fichier source comme paramètre, le programme effectue la c ompilation et le linkage (lignes 3 et 4). Puis, il envoie le contrôle à l'étiquette FIN (ligne 5). l Notons enfin l'emploi de l'instruction FOR pour indiquer à l'utilisateur distrait quels sont les fichiers source qu'il peut trouver sur le disque (ligne 11). 6.3. Les variables d'environnement : la variable d'environnement peut être testée exactement comme un paramètre de la ligne de commande. La figure 11.11 montre comment effectuer le test. if '%VARIABLE%' == 'Valeur' goto ETIQUETTE Notons que : %VARIABLE% : est le nom de la variable d'environnement à tester . Le nom de la variable est entouré de deus signes de % : cela est indispensable. Des apostrophes sont aussi utilisés pour entourer la variable d'environnement. Valeur : il s'agit de la valeur de comparaison. Cette valeur est entourée de deux apostrophes, comme la variable d'environnement. FIG 11.11 : le test d'une variable d'environnement 11. Le traitement batch Page 7 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 l Exemple : la figure 11.12 nous présente un exemple dans lequel on utilise une variable d'environnement, DEJA-EXECUTE, pour vérifier si le programme batch a déjà été exécuté au moins une fois. 1 @echo off 2 cls 3 rem ** Ce programme montre comment se servir des variables d'environnement 4 if '%DEJA-EXECUTE%' == 'OUI' goto PAS-PREMIERE-FOIS 5 :PREMIER-FOIS 6 set DEJA-EXECUTE=OUI 7 echo. 8 echo C'est la première fois que vous exécutez ce programme. 9 echo Essayez de le lancer à nouveau pour voir ce qui se passe. Pesez une touche... 10 pause > nul 11 goto FIN 12 :PAS-PREMIERE-FOIS 13 echo. 14 echo Ce n'est pas la première fois que vous exécutez le programme... 15 echo Pesez une touche pour terminer... 16 pause > nul 17 :FIN FIG 11.12 : un programme batch qui utilise une variable d'environnement l Dans le programme de la figure 11.12 on fait ce qui suit : • On teste la valeur de la variable DEJA -EXECUTE (ligne 4). Si elle est à OUI, alors on saute à PASPREMIERE-FOIS et on affiche un message qui affiche à l'utilisateur un message pour indiquer que le programme a déjà été exécuté au moins une fois. • Si la variable DEJA-EXECUTE vaut autre chose que OUI (ou tout simplement n'existe pas encore), alors on fait les opérations suivantes (ligne 5-11) : F set DEJA-EXECUTE = OUI : on initialise DEJA-EXECUTE à OUI. F On affiche un message qui indique à l'utilisateur que c'est la première fois qu'il exécute ce programme. F On renvoie le contrôle du programme à l'étiquette FIN. • Rappelons à nouveau que le fait d'entourer le nom de la variable d'environnement et la valeur de comparaison avec des apostrophes permet d'éviter que le DOS affiche le message "erreur de syntaxe" dans le cas où la variable DEJA-EXECUTE n'ait pas encore été définie (et c'est le cas, en principe, lors de la première exécution du programme). 11. Le traitement batch Page 8 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 7. Les tests IF EXIST et IF NOT EXIST 7.1. Il est parfois nécessaire de tester l'existence (ou inexistence) d'un fichier avant de le traiter. Considérons les deux cas suivants : l On veut effacer un fichier : avant d'effectuer l'opération, on veut s'assurer que ce fichier existe sur le disque. En effet, si le fichier n'existe pas et on donne l'ordre d'effacement, un message du DOS sera envoyé à l'utilisateur; nous souhaitons intercepter le message du MS-DOS afin d'envoyer à l'utilisateur un message personnalisé qui, de manière très conviviale, lui dit que le fichier spécifié n'existe pas. l On veut créer un nouveau fichier : avant d'effectuer l'opération on veut peut -être s'assurer que sur le disque n'existe pas un fichier avec le même nom. Ici, il ne s'agit plus de donner un message à l'utilisateur, mais plutôt de prévenir des pertes irrécupérables d'informations. La figure 11.13 montre la syntaxe des deux opérateurs. if EXIST Nom_Fichier Retourne VRAI si le fichier spécifié existe sur le disque if NOT EXIST Nom_Fichier Retourne VRAI si le fichier spécifié n'existe pas sur le disque FIG 11.13 : syntaxe et fonctionnement des deux opérateurs EXIST et NOT EXIST Précisons que très souvent (en effet, presque toujours) le nom de fichier sera fourni en tant que paramètre sur la ligne de commande, afin de rendre le programme le plus souple possible. 7.2. Exemple : la figure 11.14 montre une variante du programme batch présenté à la figure 11.10. Dans cette nouvelle version, on teste l'existence du fichier source avant de lancer la compilation. Observons la figure 11.14 : l Après s'être assuré que l'utilisateur a passé un paramètre sur la ligne de commande ( ligne 2), le programme vérifie que le fichier spécifié existe sur disque (ligne 3). Le programme estime que l'utilisateur a spécifié le nom du fichier sans l'extension ASM. Si le test IF NOT EXIST %1.ASM est évalué à VRAI, le contrôle passe à l'étiquette ERREUR. l Si le fichier %1.ASM existe sur disque, le programme passe à la compilation (ligne 4). Si la compilation s'effectue avec succès, elle produit un fichier dont le nom est le même que le fichier source, mais dont l'extension est OBJ. l Le programme teste l'existence du fichier %1.OBJ (ligne 5). Si le résultat du test IF EXIST %1.OBJ est VRAI, le programme passe le contrôle à l'étiquette LINKER, pour le linkage. Dans le cas contraire, un message d'erreur convenable est affiché à l'utilisateur. 11. Le traitement batch Page 9 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 1 @echo off 2 if '%1'=='' goto ERROR 3 if NOT EXIST %1.ASM goto ERROR 4 tasm %1 /n 5 if EXIST %1.OBJ goto LINKER 6 echo La compilation a produit une erreur (aucun fichier objet n'est disponible). 7 echo Corrige les erreurs et essaie à nouveau. Appuie une touche pour terminer. 8 pause > nul 9 goto FIN 10 :LINKER 11 tlink %1 12 goto FIN 13 :ERROR 14 cls 15 echo Spécifiez un nom de programme ASM à compiler. 16 echo Voici la liste des sources actuellement disponibles 17 echo --------------------------------------------------- 18 for %%i in (*.asm) do echo %%i 19 :FIN FIG 11.14 : utilisation de EXIST et NOT EXIST 8. L'utilisation du ERRORLEVEL 8.1. Lorsqu'un programme termine, il laisse dans un registre (une petite case) du microprocesseur une valeur; cette valeur est passée au MS-DOS; grâce à cette valeur de retour, le MS-DOS peut connaître la manière dont le programme s'est terminé. La valeur retournée par un programme s'appelle code d'erreur et l'instruction qui permet de l'évaluer est IF ERRORLEVEL Valeur. La figure 11.15 montre comment un programme peut passer une valeur au MS-DOS. (a) (b) Programme X en exécution Programme X terminé. Il met un code d'erreur dans un registre du microprocesseur (c) Le MS-DOS examine la valeur que le programme X a laissé dans le microprocesseur MS-DOS MS-DOS MS-DOS Errorlevel ? Microprocesseur Microprocesseur 100 Microprocesseur 100 FIG 11.15 : le mécanisme du ERRORLEVEL Observons la figure 11.15 : l Le programme X est en phase d'exécution [11.15 (a)] . Le microprocesseur, pour l'instant, ne contient rien qui nous intéresse directement. 11. Le traitement batch Page 10 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 l Le programme X termine son exécution. Le programmeur a conçu le programme X de façon à ce que celui ci, en terminant, laisse dans le microprocesseur une valeur appelée code d'erreur. Ici, le programme X laisse dans le microprocesseur la valeur 100 [ fig 11.15(b)] . l Le MS-DOS reprend le contrôle de la machine et va tester, à l'aide de l'instruction IF ERRORLEVEL, le contenu du registre du microprocesseur pour voir ce qu'il contient. 8.2. Le mécanisme : le ERRORLEVEL est une variable qui contiendra le code de retour d'un programme. Dans un programme batch on pourra tester la valeur contenue dans cette variable dans le cadre d'une instruction IF. Attention : le test est VRAI si la variable ERRORLEVEL contient une valeur égale ou supérieure à la valeur de comparaison. Cela signifie que si un programme peut retourner plusieurs ERRORLEVEL, il faudra les tester du plus grand au plus petit. 8.3. Le mécanisme d'ERRORLEVEL a été intégré à DOS pour informer des erreurs qui peuvent se produire. Les valeurs possibles sont fondamentalement au nombre de trois: - ERRORLEVEL vaut zéro et cela signifie pas d'erreur - ERRORLEVEL > 0 signifie qu'une erreur s'est produite. - La signification de telle ou telle valeur n'est pas définie, elle varie en fonction de la commande MS-DOS. De manière générale, plus la valeur est élevée, plus l'erreur est grave. L'application la plus intéressante du principe du ERRORLEVEL est dans le cadre des menus des utilisateurs. On procède comme suit : l On crée un programme dans un langage de programmation quelconque (C, Pasc al, Assembleur) pour autant que ce langage permette de terminer en donnant au MS-DOS un code de sortie. l Le programme affichera un message du type "Votre choix : " à un endroit de l'écran. Le programme sera conçu de telle manière que, lorsque l'utilisateur appuie sur une touche, le programme termine l'exécution et passe au MS-DOS un code (généralement le code ASCII) de la touche appuyée. l Le programme sera encadré dans un fichier batch dont la structure sera celle qui est schématiquement montrée à la figure 11.16. Programme (le programme écrit en C) if errorlevel 3 goto CHOIX-3 if errorlevel 2 goto CHOIX-2 if errorlevel 1 goto CHOIX-1 :CHOIX-1 ŸŸŸ goto FIN :CHOIX-2 ŸŸŸ goto FIN :CHOIX-3 ŸŸŸ goto FIN Instructions propres au choix 1 Instructions propres au choix 2 Instructions propres au choix 3 :FIN FIG 11.16 : schéma d'un programma batch qui se sert des ERRORLEVEL Observons la figure 11.16 : l Programme : c'est l'instruction qui appelle le programme qui permet, lors de sa terminaison, de renvoyer un code d'erreur au MS-DOS. 11. Le traitement batch Page 11 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 l if errorlevel 3 goto CHOIX-3 : c'est l'instruction qui permet d'évaluer le contenu de la variable ERRORLEVEL. Si cette variable contient une valeur supérieure ou égale à 3, alors on dirige le contrôle du programme vers l'étiquette CHOIX-3. Les mêmes considérations peuvent être faites pour les autres instructions IF ERRORLEVEL... 8.4. Exemple : la figure 11.17 montre un programme écrit en langage C qui génère des errorlevel : #include <modele.h> #include <ctype.h> void main(int argc, char* argv[]) { int i, l; char c; while (1) { gotoxy(10,23); printf("Votre choix : "); c=getch(); c = toupper(c); l = strlen(argv[1]); for (i=0; i < l; i++) if (argv[1][i] == c) exit(c); } } Programme TEST.CPP FIG 11.17 : programme C qui termine en passant au MS-DOS des codes d'erreur l Le programme de la figure 11.17 s'utilise comme suit : • L'appel doit être effectué en spécifiant sur la ligne de commande quels sont les caractères que le programme pourra accepter. Par exemple TEST ABCD permettra au programme de terminer son exécution seulement lorsque l'utilisateur introduira une des lettres ABCD. • Le programme devra être intégré dans un programme batch où l'on attrapera les codes d'erreurs que ce programme génère. Examinons la figure 11.18 qui montre un programme batch qui utilise le programme de la figure 11.17 et notons les points suivants : l Le petit programme propose à l'utilisateur un menu de choix (4 dans ce cas). Il pourrait s'agir, par exemple, d'un menu qui permet le lancement de l'un des quatre logiciels. l On appelle le programme TEST en spécifiant comme paramètre la chaîne de caractères ABCD, ce qui veut dire que le programme TEST terminera (en retournant un code d'erreur) seulement lorsque l'utilisateur appuiera sur une des 4 lettres A, B, C ou D. 11. Le traitement batch Page 12 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 l Lorsque le programme TEST termine, on sait que l'utilisateur a appuyé sur une des 4 lettres proposées : on teste alors la variable ERROLEVEL, en commençant toujours par la valeur la plus élevée. @echo off cls rem ** Ce programme emploie TEST.EXE pour générer des errorlevel contrôlés rem ** On appelle TEST.EXE en spécifiant que les valeurs admises sont :ABCD echo. echo. echo A = Option A. echo B = Option B. echo C = Option C. echo D = Option D. test ABCD if errorlevel 68 goto CHOIX-D if errorlevel 67 goto CHOIX-C if errorlevel 66 goto CHOIX-B if errorlevel 65 goto CHOIX-A :CHOIX-D echo. echo Vous avez pesé sur D. Pesez une touche pour terminer... pause > nul goto FIN :CHOIX-C echo. echo Vous avez pesé sur C. Pesez une touche pour terminer... pause > nul goto FIN :CHOIX-B echo. echo Vous avez pesé sur B. Pesez une touche pour terminer... pause > nul goto FIN :CHOIX-A echo. echo Vous avez pesé sur A. Pesez une touche pour terminer... pause > nul goto FIN :FIN FIG 11.18 : programme exemple qui utilise les ERRORLEVEL 8.5. ERRORLEVEL dans les commandes MS-DOS l Toutes les commandes MS-DOS ne retournent pas de valeurs d'erreurs, et de plus chaque commande ne peut retourner que certaines valeurs. Enfin, les valeurs retournées varient avec les versions MS-DOS. Il faut donc être prêt à faire quelques essais pour établir une liste des valeurs correspondant aux erreurs. Voici un tableau des codes ERRORLEVEL les plus importants: 11. Le traitement batch Page 13 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 ATTRIB DEFRAG 1 paramètre erroné ou fichier non trouvé 3 annulation 0 Défragmentation réussie 1 Erreur interne dans le traitement 2 Pas même un cluster libre 3 Processus interrompu (Ctrl+C) 4 Erreur générale dans le traitement 5 Erreur de lecture sur disque 6 Erreur d'écriture sur disque 7 Erreur allocation cluster (utilisez scandisk) 8 Erreur d'allocation mémoire 9 Mémoire insuffisante 0 Disques identiques 1 Disques différents 2 Processus interrompu (Ctrl+C) 3 Erreur irrécupérable de lecture ou d'écriture 4 Mémoire insuffisante, ou lecteur invalide ou erreur de syntaxe 0 Copie réussie 1 Erreur de lecture ou d'écriture non fatale 2 Processus interrompu (Ctrl+C) 3 Impossible de destination 4 Mémoire insuffisante, ou lecteur invalide ou erreur de syntaxe 0 Recherche fructueuse (élément trouvé) 1 Recherche complétée (élément non trouvé) 2 Erreur pendant la recherche 0 Format réussi 3 Interruption avec Ctrl+C format non complété 4 Erreur fatale, format non complété 5 L'utilisateur a répondu N à l'invite de formatage d'un autre disque. 0 Chargement du clavier réussi 1 Ligne de commande invalide 2 Table invalide 3 Ne peut pas créer la table 4 Erreur console 5 Page de codes non préparée 6 Table manquante 7 Version MS-DOS incorrecte 0 Fichier déplacé avec succès 1 Erreur dans le déplacement des fichiers MSAV 86 Virus détecté XCOPY 0 Copie effectuée avec succès 1 Fichiers à copier non trouvés 2 Processus interrompu (Ctrl+C) DISKCOMP DISKCOPY FIND FORMAT KEYB MOVE 11. Le traitement batch Page 14 sur 17 lire source ou de formater Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 4 Erreur d'initialisation (mémoire insuffisante, lecteur invalide, fichier ou chemin inexistant ou erreur de syntaxe) 5 Erreur d'écriture sur disque 8.6. Comment reconnaître les ERRORLEVEL dans les commandes? l Il n'est pas facile de trouver les ERRORLEVEL possibles d'une commande car il faut commencer par provoquer les "bonnes erreurs" avant de pouvoir lire la valeur retournée. Dans quelques manuels MS -DOS des listes de valeurs retournées en cas d'erreur sont souvent très parcellaires et correspondent rarement aux résultats de notre propre expérience. Le fichier ERROR.BAT ci-dessous peut vous aider à trouver les 10 premières valeurs retournées éventuellement par une commande MS-DOS. Par exemple, pour trouver les errorlevel de la commande FORMAT on pourrait utiliser le fichier suivant: @ECHO OFF FORMAT B: ECHO. IF ERRORLEVEL 9 goto neuf IF ERRORLEVEL 8 goto huit IF ERRORLEVEL 7 goto sept IF ERRORLEVEL 6 goto six IF ERRORLEVEL 5 goto cinq IF ERRORLEVEL 4 goto quatre IF ERRORLEVEL 3 goto trois IF ERRORLEVEL 2 goto deux IF ERRORLEVEL 1 goto un goto fin :neuf echo neuf goto fin :huit echo huit goto fin :sept echo sept goto fin :six echo six goto fin :cinq echo cinq goto fin :quatre echo quatre goto fin :trois echo trois goto fin :deux echo deux goto fin :un echo un goto fin :fin ECHO ON 11. Le traitement batch Page 15 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 l Essayez-le avec une disquette pour test en provoquant volontairement une erreur, par exemple essayez ce fichier batch tout en protégeant votre disquette contre l'écriture. Quel est le numéro de l'erreur retourné par le programme format? 9. L'appel à des sous-programmes (CALL) 9.1. Un programme batch peut interrompre temporairement son exécution, appeler un autre programme batch, puis, lorsque le programme appelé termine, continuer son exécution normale. Ce mécanisme qui rappelle les sous programmes du BASIC ou les procédures/fonctions du Pascal et du C, fonctionne à l'aide de la commande CALL. Observons la figure 11.19 qui nous donne un exemple de l'appel d'un sous-programme à l'aide de l'instruction CALL. Nous pouvons faire les observations suivantes : l Le programme principal contient une boucle grâce à laquelle on passe en revue tous les fichiers du répertoire courant. Pour chacun de ces fichiers, on appelle (via un CALL) le programme TRAITER.BAT. l Lors de l'appel du sous-programme on passe au sous-programme le nom du fichier actuel comme paramètre (grâce au %%i). l Dans le programme appelé on traite le paramètre passé par le programme appelant comme un paramètre normal de la ligne de commande. Le programme principal @echo off cls rem ** On appelle le sous-programme TRAITER en lui passant comme paramètre rem ** un nom de fichier (les fichiers sont obtenus grâce à la boucle for) for %%i in (*.*) do call TRAITER %%i echo Le traitement des fichiers est terminé. Pesez une touche... pause > nul PrLe sous-programme TRAITER.BAT @echo off echo. rem ** Ce sous-programme reçoit un paramètre depuis le programme appelant. echo Bienvenue dans le programme TRAITER. Je traite le fichier %1. echo Pesez une touche pour voir le contenu du fichier %1... pause > nul type %1 echo. echo C'est fini. Appuyez sur une touche... pause > nul FIG 11.19 : exemple de programme batch qui appelle un sous-programme avec CALL Questions de révision 9.2. Principes du traitement batch l A quoi sert un programme batch ? l Comment peut-on créer un programme batch ? 11. Le traitement batch Page 16 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003 l Quelle extension doit avoir un fichier batch ? l A quoi sert l'instruction @echo off ? l Quel est le rôle du symbole ">" ? l Comment peut-on afficher un message ? 9.3. L'instruction FOR l A quoi sert l'instruction FOR ? l Pouvez-vous expliquer ce que fait l'instruction "FOR %A in (*.EXE) do COPY %a *.BAK" ? l Quelle est la différence entre l'expression "%A" et "%%A" ? Quand utilise-t-on la première et quand utiliset-on la deuxième ? 9.4. Les paramètres sur la ligne de commande l Qu'est-ce qu'un paramètre sur la ligne de commande ? l Comment peut-on "attraper" un paramètre sur la ligne de commande dans un fichier batch ? l Que contient le paramètre "%0" ? 9.5. Les paramètres d'environnement l Qu'est-ce qu'un "paramètre d'environnement" ? l Comment peut-on créer une variable d'environnement ? l Comment peut-on détruire une variable d'environnement ? 9.6. L'étiquette l Qu'est-ce qu'une étiquette ? l A quoi sert une étiquette ? 9.7. L'instruction IF l A quoi sert l'instruction IF ? l Comment peut-on tester la valeur d'un paramètre passé sur la ligne de commande ? l Pour quelle raison conseille-t-on d'entourer la valeur à comparer, ainsi que la variable, de deu x apostrophes ? l Que met-on normalement après une instruction IF ? l Comment peut-on tester une variable d'environnement ? 9.8. Les tests IF EXIST et IF NOT EXIST l A quoi sert l'instruction IF EXIST ? l A quoi sert l'instruction IF NOT EXIST ? 9.9. L'utilisation du ERRORLEVEL l Qu'est-ce que le ERRORLEVEL ? l Comment peut-on utiliser le ERRORLEVEL dans un programme batch ? l Les niveaux d'erreur doivent être traités d'une manière précise. Pouvez -vous dire laquelle ? 9.10.L'appel à des sous-programmes l Comment peut-on appeler un sous-programme depuis un programme batch ? 11. Le traitement batch Page 17 sur 17 Arches Informatique/Système d'exploitation/Bignotti/27.11.2003