Batchs

à la découverte des traitements par lot

Jean-Luc Antoine - 06/06/2002

Windows est fourni avec une version du DOS. Il est donc possible d'en exploiter toutes les fonctionnalités, et plus précisément l'enchaînement de commandes définies dans un script. C'est le principe même des batchs qui, s'il est utilisé astucieusement, permet de réaliser ce que vous n'oseriez même pas imaginer. Le DOS, si obsolète soit-il, est quand même fort utile pour les traitements automatisés sous Windows.

Un fichier batch est un simple fichier texte (ascii) contenant pour chaque ligne des commandes que le DOS est capable d'interpréter. L'extension du fichier est obligatoirement .BAT ou .CMD (pour les OS plus récents). Ce type de fichier peut être indifféremment lancé depuis une session DOS ou bien directement par un double clic depuis Windows. Pour créer un de ces fichiers, il faut utiliser un éditeur de textes qui ne sauve pas dans un format binaire mais en texte brut. C'est le cas du notepad ou de Edit sous Dos. Par contre, Write, Wordpad ou même Word sont à proscrire.
L'exécution du fichier par le système consiste à traiter successivement chacune des lignes inscrites. Les commandes que l'on peut placer dans ce type de fichiers sont les commandes internes du dos telles dir, copy, type, ou des commandes externes qui sont des programmes exécutables voir même d'autres batchs. Des commandes spécifiques aux fichiers batchs permettent de tester la valeur d'un retour de programme ou d'effectuer des sauts conditionnels.

Premier fichier .bat

La création d'un fichier batch est tellement simple que vous en comprendrez vite le fonctionnement. Supposons que nous voulions créer un programme qui crée un répertoire puis définisse celui-ci comme répertoire courant, depuis une session Dos. En temps normal, nous taperions successivement "md toto" puis "cd toto" pour créer puis aller dans le répertoire toto. Et bien dans le fichier batch, il suffit de taper ces deux lignes pour que l'exécution soit identique. Evidemment, il n'est pas intéressant d'automatiser un traitement qui soit si rigide, à savoir qu'il ne soit que capable de créer le répertoire toto. Nous allons donc l'améliorer pour qu'il soit en mesure de créer n'importe quel répertoire, comme si c'était une commande du dos. Pour cela, le programme doit être en mesure de récupérer les paramètres qu'on lui passe. Nomons notre fichier mcd.bat. On veut pouvoir taper "mcd test" pour créer dans le répertoire courant le sous-répertoire test et s'y déplacer. En fait, le paramètre peut être lu dans la variable %1. Si l'on devait passer plusieurs paramètres, ils seraient placés dans les variables internes %1, %2, %3 etc. Notre programme devient donc le suivant:

md %1
cd %1
Lorsque l'on lance "mcd test", on remarque hélas l'affichage successif des commandes effectuées. Cela manque de discrétion. Les commandes internes du dos n'affichent pas les différentes étapes, donc nous allons en faire autant. La commande miracle à placer en début de fichier est "echo off", ce qui indique que les commandes qui suivent doivent être exécutées sans afficher leur ligne de commande. A l'exécution, nous ne voyons plus s'afficher les commandes employées, mais le message "echo off" apparaît quand même. Là encore, il existe une formule magique à connaître car on ne peut pas l'inventer: faire précéder la commande "echo off" par le caractère @. Toute commande commençant par ce caractère va être exécutée sans que la ligne de commande ne soit affichée lors de l'exécution du fichier batch. Le fichier final est le suivant:
@echo off
md %1
cd %1
Commandes de batchs

Il est possible de placer des commentaires dans les fichiers batchs. Pour cela, il faut commencer la ligne par le mot clef REM. En effet, tout ce qui suit cette commande est tout simplement ignoré. Pour afficher du texte, la commande Echo s'en chargera. Des sauts peuvent être égalements effectués dans le même fichier avec la commande goto suivie du nom d'un label. Un label est un mot isolé placé sur une ligne et commençant par ":", comme par exemple :test. Voici un batch illustrant toutes ces commandes (inutile.bat).

@echo off
rem ce fichier est totalement inutile
echo Début de l'exécution
goto suite
echo Cette ligne est sautée
:suite
echo c'est la fin

Une commande pouvant être un appel à un fichier exécutable, il est envisageable d'appeler un autre fichier batch depuis un premier. Il faut cependant faire la distinction selon que l'on veuille que le second se termine en continuant le premier ou non. Lorsque l'on appel directement un fichier batch, il n'y a pas de "retour" au fichier batch appelant. Voici pour illustrer deux batchs que l'on nomme successivement test.bat et essai.bat:

echo premier fichier batch (test.bat)
essai
echo cette ligne n'apparaît jamais

echo second fichier batch (essai.bat)
echo l'exécution se termine ici
Lancez test.bat, vous verrez que la ligne figurant après l'appel à "essai" n'est pas exécutée. Si l'on désire réellement continuer l'exécution du premier, et ainsi considérer le batch appelé comme une véritable routine externe, il faut faire précéder l'appel par la commande CALL. Le premier batch devient alors :
echo premier fichier batch (test.bat)
call essai
echo cette ligne apparait maintenant
A ce stade, on comprend que les commandes utilisées dans les fichiers batchs ont tout d'un mini langage de programmation. Même les fonctions de test sont présentes. La commande "if" permet de tester l'égalité entre deux valeurs, la présence d'un fichier ou la valeur de retour d'un programme. On peut même lui adjoindre une négation (NOT) pour faire le test inverse. Pour savoir si le premier paramètre passé en ligne de commande est spécifié, on utilisera l'égalité suivante : if "%1"=="" echo La ligne de commande est vide.
Pour savoir si un fichier est présent, on utilisera une syntaxe similaire à ce qui suit : if exist c:\test.txt echo Le fichier a été trouvé.
Pour savoir si un programme s'est correctement terminé, on reçoit sa valeur de retour (un nombre) dans ERRORLEVEL. Cette fonction indique si un code d'erreur d'un certain niveau est apparu. Supposons qu'un programme retourne un code d'erreur égal à 12, Errorlevel 12 va être vrai, tout comme errorlevel 5 (car 5<12) mais pas errorlevel 14 par exemple. Pour mieux comprendre, testons le retour d'une vérification du disque dur. Si un problème est apparu, errorlevel sera non nul.
chkdsk c:
if errorlevel 1 echo Nous avons décelé une erreur
echo le programme est fini
Des commandes encore plus évoluées

Nous pouvons définir des commandes, des sauts, des appels avec éventuellement des tests de valeur de retour, mais aussi des paramètres. Comme nous l'avons vu, %1 contient le paramètre en ligne de commande. Nous allons voir comment autoriser plusieurs paramètres à notre fichier batch, sans que le nombre ne soit fixe. Le programme que nous allons créer va se contenter de lister tous les paramètres de la ligne de commande. La méthode utilise un décalage de paramètres, c'est à dire que la commande SHIFT a pour but de placer le second paramètre à la place du premier, le troisième à la place du second, et ainsi de suite. Après appel le premier paramètre est perdu, et lorsque celui-ci sera vide, c'est qu'il n'y a plus de paramètres à décaler. Il faut donc utiliser autant de fois Shift qu'il y a de paramètres. Voici le programme (param.bat) :

@echo off
:debut
if "%1"=="" goto fin
echo Paramètre : %1
shift
goto debut
:fin
echo C'est fini
Parmi les commandes disponibles pour les traitements par lots figurent les boucles. Elles permettent d'effectuer un traitement particulier à toute une liste de fichiers ou de valeurs. La ligne suivante tapée directement en ligne de commande affiche le contenu de la liste indiquée : for %A in (1,2,3) do echo %A . Son utilisation dans un fichier batch différe de son utilisation en ligne de commande. Pour l'utiliser dans un fichier, la variable devient %%A : for %%A in (1,2,3) do echo %%A. C'est une des différences entre l'utilisation en ligne de commande et l'utilisation par batchs des commandes internes du DOS. La liste peut être exhaustive comme nous venons de le voir, ou correspondre à une liste de fichiers correspondant à un critère donné. La ligne de commande suivante affiche tous les fichiers du répertoire courant : for %a in (*.*) do echo %a. Evidemment, les différents types de liste peuvent être mélangés : for %a in (1,2,*.*,3,4) do echo %a. Il est même possible d'utiliser les variables d'environnement disponibles. Ces dernières sont affichables en tapant la commande "SET". Par exemple, la ligne de commande suivante affiche chaque chemin du path : for %a in (%path%) do echo %a. Après le "do" peut figurer n'importe quelle commande du Dos, sauf une autre boucle FOR. Voici par exemple un fichier batch permettant d'afficher les répertoire du path contenant au moins un fichier batch :
@echo off
for %%a in (%path%) do if exist %%a\*.bat echo %%a
Les applications qui en découlent permettent d'effectuer le même traitement à plusieurs fichiers, comme par exemple pour une utilisation conjointe d'un compacteur en ligne de commandes.

Les variables

Les variables permettent de mémoriser une valeur pour la réutiliser ultérieurement. Il en existe trois sortes : les variables de boucles, les variables système et les autres variables d'environnement. Nous avons déjà eu l'occasion d'entrevoir ces dernières gràce à la commande "SET". Le résultat de cette commande interne du DOS affiche des lignes de la forme NomDeVariable=Valeur. Pour pouvoir exploiter leur contenu, il faut les encadrer avec le caractère "%". Par exemple la commande ECHO %TEMP% va afficher le chemin d'accès au répertoire temporaire. Ces variables sont souvent définies lors de l'exécution du fichier AutoExec.Bat au démarrage de l'ordinateur, pour être ensuite exploitées par les logiciels. Par exemple, la variable BLASTER va contenir les paramètres nécessaires au fonctionnement de la carte Sound Blaster si vous en avez une. Parmi les variables d'environnement sont comprises des variables internes définies systématiquement. Lors d'une session DOS depuis Windows, la variable WINDIR est présente et contient le chemin d'accès à Windows. La variable COMSPEC précise quel est le fichier de commandes qui est sollicité. La variable PROMPT contient l'aspect de la ligne de commande sous DOS. Il est possible d'ajouter à cette liste des variables personnelles. Pour cela, on assigne un contenu à une variable comme suit : SET =. Ainsi la ligne de commande "SET TEST=Juste un essai" permet d'associer la phrase à la variable "TEST". D'autres variables plus locales sont également exploitables : celles utilisées pour les boucles comme nous l'avons vu précédemment, et celles utilisées pour contenir les paramètres de la ligne de commande du fichier batch (%1, %2, ... %9) ainsi que %0 qui contient le nom du fichier batch appelé.

Les redirections

Le DOS utilise un système d'entrées/sorties qui autorise les redirections. Si vous avez besoin d'inscrire dans un fichier ce qui est affiché à l'écran (sortie standard), il vous suffit d'ajouter à la suite de votre commande le signe ">" suivi du nom de fichier. Par exemple "ECHO Hop, je n'apparais pas à l'écran>c:\test.txt" va créer le fichier test.txt et y inscrire la phrase. Par contre, la sortie standard étant redirigée vers le fichier, rien n'apparaîtra à l'écran. Si vous voulez ajouter une seconde ligne à ce fichier, il faut exploiter le redirecteur ">>", ce qui permet d'écrire à la suite du fichier, car sinon il serait écrasé avant d'écrire la ligne suivante. La commande "echo C'est la seconde ligne>>c:\test.txt" l'illustre. Pour mieux comprendre, la commande copy c:\test.txt c:\test2.txt effectue une copie de notre fichier texte. Il est possible d'obtenir le même résultat sans utiliser la commande de copie : type c:\test.txt > c:\test2.txt. En effet, ce qui était censé être affiché à l'écran va être redirigé vers un nouveau fichier. Cette astuce permet également de concaténer des fichiers textes en utilisant l'opérateur ">>". Un autre redirecteur est le pipe, que l'on prononce paillpe, et qui s'écrit "|". Ce caractère est accessible au clavier sous le chiffre 6 avec la touche Alt. Son rôle est de transférer la sortie standard d'un programme vers l'entrée standard d'un autre. L'entrée standard est normalement le clavier. La commande type truc.txt|more exploite pleinement cette possibilité : la sortie écran par type est renvoyée sur le programme more, qui permet la gestion des défilement de pages. Notez que le flux de données qui transite est quand même écrit temporairement sur disque. La commande suivante : "more<truc.txt" règle le problème en obtenant le même résultat, et nous amène à notre dernier redirecteur : celui de l'entrée standard. Il indique le nom d'un fichier qui contient l'équivalent de ce qui aurait été tapé au clavier.

Plein de bonnes choses

Etre capable d'enchaîner des actions consécutives c'est bien, mais permettre une interaction avec l'utilisateur pour qu'il puisse contrôler le déroulement du fichier batch, c'est mieux. C'est pourquoi le DOS comprend la commande CHOICE. Celle-ci bloque l'exécution du traitement par lots et attend la pression d'une touche au clavier, avec la possibilité d'afficher une question. La sysntaxe est un peu complexe, mais permet de pallier à tous les besoins. Généralement, on utilise la suivante : "Choice /c:abc Veuillez indiquer votre choix". Le résultat a pour effet d'afficher le message "Veuillez indiquer votre choix" à l'écran et d(attendre la pression d'une touche parmi celles indiquées, en l'occurence a,b ou c. Bien entendu, le choix des touches aurait pu être /c:ON pour une question attendant Oui ou Non. Après le paramètre "/c:" on indique toutes les lettres autorisées. Pour orienter le traitement du batch selon la réponse, il faut tester ERRORLEVEL comme nous l'avons vu dans le précédent numéro. Le code de retour correspond à la touche tapée, dans l'ordre. Par exemple, pour le paramètre /c:abc la touche a retourne un code d'erreur de 1, b de 2 et c de 3. Il faut donc commencer par tester c puis b puis a car le code inférieur est toujours vrai si un code supérieur est déclenché. Voici un menu complet exploitant ces possibilités :

@echo off
cls
echo Au menu ...
echo.
echo A - Panneau de contrôle
echo B - Bloc-notes
echo C - Calculatrice
Choice /c:abc Tapez la touche correspondante
if errorlevel 3 goto calc
if errorlevel 2 goto BN
start control
goto termine
:BN
start notepad
goto termine
:calc
start calc
:termine
Vous noterez au passage la façon dont on appèle des programmes de Windows depuis une session DOS : en inscrivant "start" devant. Enfin, le dernier point à connaître, c'est l'arrêt manuel immédiat des traitements par lots : appuyez simultanément sur les touches Control + C. Maintenant, vous avez toutes les billes en main pour faire les batchs les plus fous...
Server Info
Remote Info
Compress

Batchs
BootSector
Droit
Accessoire GFA
On Now
Ecran plasma
Système d'exploitation
Son
Unités
Scripting
Multilingue
Site Web
Bruit et son
Architecture Google


4K
Color picker
TaskList
Backup files
Mini Port Scanner
Website To CHM
PixyDemo
Web password recovery
4KWebServer
Kill Popup
VBE decoder
Script Optimizer
Database Password Recovery
Class
Ini
EMail validator
Graphical Class
MP3 Info
Pinger Class
IP ranger class
SoftwareMetering
Path Validator
Time Stamper Class
LoggerCLS
HTA
Keyword Ranking
DOM Explorer
HTA-Notepad
PixyPortManager
Other
flashMessage
Kill Popup
VBE decoder (fixed)
Error Codes
Maze generator
Char counter
HTML To Word
ICQ Choose User
ScreenSaver Password decoder
Mp3Playlister - singleList
Long Filename To Short
Trace Math
Dump Hexa File
Self modifying script
Mp3Playlister - multiList
HTANoid
PixyWebServer
Python
Progress indication

©2002 Jean-Luc Antoine. All Rights Reserved. Scripts or any other material on this website may not be redistributed or put as part of ANY collection (script archives, CDs etc) without prior written permission. Permission granted to use and modify any of the scripts found on InterClasse.com