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

Documents pareils