MS Dos Le DOS sied

Fichiers de commandes

Les fichiers bat

Les fichiers de commandes du DOS ne se différencient guère, tout au moins sur le plan du principe, de ceux que l'on utilise avec d'autres systèmes d'exploitation. Un fichier de commandes contient une série de commandes qui doivent être exécutées en séquence sans que l'on ait à intervenir à chacune d'elle. Il peut éventuellement contenir des structures de contrôle de type if...goto renvoyant à des étiquettes et permettant d'adapter l'enchaînement de ces commandes à la survenance de certains événements. Il s'agit donc d'un programme, que l'on appelle dans ce cas un script, qui va s'exécuter sur simple évocation du nom du fichier qui le contient.

Sous DOS, pour qu'un fichier soit reconnu comme un fichier de commandes, il doit être suffixé par l'extension bat. On parlera donc le plus souvent de .bat (prononcez point batte). Bat est ici un abrégé de batch, qui signifie traitement par lot, qu'on oppose généralement à traitement unitaire bien que, dans ce cas, il faille plutôt entendre traitement automatique par opposition à traitement interactif.

Un exemple pour débuter

Pour bien comprendre le mécanisme ouvrons le bloc-notes et saisissons la ligne suivante :

echo Bonjour mon bébé

Il suffit ensuite d'enregistrer le fichier sous le nom test.bat pour qu'en tapant test (l'extension n'est obligatoire qu'en cas d'homonymie) dans Démarrer / Exécuter ou en mode commande l'on obtienne :

Fichiers .bat test1

Ce test élémentaire permet déjà de faire plusieurs constats :
   - les commandes contenues dans le .bat sont affichées avant leur exécution ;
   - tout ce qui suit la commande echo est interprété comme une chaîne de caractères sans qu'il y ait besoin de la mettre entre guillemets ;
   - la différentiation majuscules minuscules à l'intérieur de cette chaîne est bien respectée mais les caractères munis de signes diacritiques (accents, tréma, cédille) apparaissent bizarrement.

Quelques améliorations

Si l'on souhaite limiter l'affichage au résultat de l'exécution des commandes, il faut passer au préalable la commande echo off. L'exemple précédent devient :

echo off
echo Bonjour mon bébé

Et l'on obtient :

Fichiers .bat test2

C'est mieux mais ce n'est pas encore parfait. Au passage on aura remarqué que chaque commande doit être saisie sur une ligne spécifique. Des lignes vides peuvent être insérées, elles ne sont pas prises en compte.

Pour que la commande echo off ne provoque pas son propre affichage, il faut la faire précéder du caractère @ et pour que bébé ne se transforme pas en búbú il faut utiliser l'éditeur de texte du DOS (la commande edit) plutôt que le bloc-notes (Windows utilise le code ANSI alors que le DOS utilise le code ASCII où les caractères munis de signes diacritiques ne sont pas représentés par le même code).

Pour mettre cela en pratique, il suffit de lancer la commande :

edit test.bat

puis de modifier le fichier de manière à obtenir :

@echo off
cls
echo Bonjour mon bébé

La commande cls (clear screen) a été ajoutée pour effacer l'écran.

Fichiers .bat test3

On obtient maintenant :

Fichiers .bat test4

Que peut-on faire avec un fichier de commandes ? À la fois peu de choses et beaucoup. On est certes limité aux commandes du DOS mais Windows peut ne pas être actif et, même s'il l'est, un .bat reste un outil simple et facile à maîtriser par rapport à d'autres, comme VBS, qui requièrent un autre registre de connaissances.

Des exemples d'utilisation de .bat sont mentionnés dans d'autres chapitres, notamment celui consacré aux fichiers config.sys et autoexec.bat. Un cas va être étudié ci-après pour montrer ce qu'il est possible de faire exécuter à un simple fichier de commandes.

Le fichier setramd.bat

Rôle

Sur une disquette d'amorce générée à l'aide de Windows figure un fichier de commandes intéressant : setramd.bat. Il permet d'affecter aux variables d'environnement ramd et cdrom la lettre d'unité assignée respectivement au lecteur virtuel et, s'il en existe un, au lecteur de CD.

Le lecteur virtuel, une portion de la mémoire vue comme une unité de disque, est crée au cours du traitement du fichier config.sys à la rencontre de la ligne :

devicehigh=ramdrive.sys /E 2048

Appel

Setramd est appelé au cours de l'exécution d'autoexec.bat par la commande :

call setramd.bat %LglDrv%

La commande call permet de lancer un autre programme et de revenir ensuite exécuter les commandes qui suivent. Comme tout programme, un .bat peut s'attendre à recevoir des paramètres. Ici, Setramd va recevoir comme paramètres le contenu de la variable d'environnement lgldvr. Les signes % qui encadrent le nom de la variable indiquent qu'il s'agit du nom d'une variable et que ce nom ne constitue pas lui-même le paramètre.

Le contenu de lgldvr a été au préalable fixé par :

set LglDrv=27 * 26 Z 25 Y 24 X 23 W 22 V 21 U 20 T 19 S 18 R 17 Q 16 P 15
set LglDrv=%LglDrv% O 14 N 13 M 12 L 11 K 10 J 9 I 8 H 7 G 6 F 5 E 4 D 3 C

On notera ici que l'on a utilisé deux lignes pour affecter une valeur à lgldvr. Le début de cette valeur est affecté par la première commande set, la deuxième permet d'ajouter la suite au bout (concaténer en termes techniques), y compris l'espace qui précède le O.

Premières commandes

Regardons maintenant le contenu de setramd.

@echo off
set RAMD=
set CDROM=

Par précaution, d'éventuelles variables d'environnement ramcd et cdrom sont supprimées et la mémoire correspondante est libérée.

echo.
echo Préparation du démarrage de votre ordinateur.
echo Ceci peut prendre quelques minutes. Veuillez patienter...
echo.

Affichage d'un message d'avertissement. On remarquera au passage les commandes echo. (sans espace devant le point) qui permettent de sauter une ligne à l'écran et d'améliorer la mise en page.

Exécution de findramd

a:\findramd

Lancement du programme findramd.exe. Le chemin d'accès est spécifié mais pas l'extension puisqu'en absence d'homonymie il n'y a pas de confusion possible.

Findramd retrouve la lettre affectée à l'unité de disque virtuelle et renvoie son numéro d'ordre (1 pour A, 2 pour B, etc.) ou un code d'erreur dans la variable système errorlevel. On teste donc le résultat de son exécution.

if errorlevel 255 goto no_ramdrive

Si errorlevel est égal ou supérieur à 255 il s'agit d'un cas d'erreur et un débranchement est effectué vers la partie du programme signalée par l'étiquette no_ramdrive Dans le cas contraire, le contrôle est passé à la ligne suivante.

if not errorlevel 3 goto no_ramdrive

Le cas où le code retour est inférieur à 3 est également considéré comme un cas d'erreur.

Boucle de comparaison entre errorlevel et le contenu de lgldvr

goto do_shift

On saute les lignes qui suivent pour passer directement à la séquence annoncée par l'étiquette do_shift.

:loop

Première étiquette rencontrée. Son nom n'est pas anodin et l'on devine que c'est le début d'une boucle (loop en anglais)

if errorlevel %1 goto no_shift

Souvenons nous du contenu de la variable d'environnement lgldvr. Puisque chaque valeur, nombre ou lettre, qu'elle contient est séparé de l'autre par un espace, setramd considère qu'il s'agit de paramètres distincts. Si l'on compte bien, il reçoit donc 50 paramètres.

Chacun d'eux peut être identifié par son numéro précédé du signe % (pour cent). Le paramètre n°1 ayant au départ la valeur 27 tout ce passe comme si on avait écrit :

if errorlevel 27 goto no_shift

Si le code retour de findramd est égal ou supérieur à 27 on saute ce qui suit jusqu'à trouver l'étiquette no_shift.

:do_shift

Nouvelle étiquette.

set cdrom=%2

On affecte le paramètre n°2 à la variable d'environnement cdrom. Dans cette première phase cdrom aura donc comme valeur « * ».

Parcours du contenu de lgldvr

shift
shift

La commande shift a pour effet de supprimer le premier paramètre et donc de décaler d'un cran les numéros de tous ceux qui suivent. Après exécution de la première commande shift, celui qui portait le n°2 devient le n°1, le n°3 devient le n°2, etc. Après deux commandes shift, on a donc décalé de deux crans vers la gauche l'ensemble des paramètres.

if not %1*==* goto loop

If...== est un test d'égalité. If not...== est un test d'inégalité. Si la valeur du premier paramètre auquel on a adjoint le caractère « * » est différente de « * » on retourne à l'étiquette loop.

Si l'on est toujours dans la première itération de la boucle, %1 est équivalent à la valeur 26 (à la suite des deux commandes shift, tout a été décalé) et comme 26* est différent de * on retourne à la partie du programme signalée par l'étiquette loop.

Est-ce que cela va durer indéfiniment ? Non car à chaque itération les tests, grâce au double décalage, vont être effectués avec de nouvelles valeurs de %1. Au départ on avait 27, maintenant on a 26 et après que la boucle a été parcourue un certain nombre de fois, le test d'égalité d'errorlevel et de %1 va être satisfait et l'on passera à la partie du programme signalée par l'étiquette no_shift.

goto no_ramdrive

On se débranche inconditionnellement vers la partie du programme signalée par l'étiquette no_ramdrive.

Cela correspond à l'éventualité où, pour une raison ou pour une autre, findramd n'aurait pas renvoyé de code retour. Dans ce cas la liste des paramètres a été épuisée sans que l'on ait pu trouver de correspondance avec une valeur, %1* est égal à *, on ne retourne pas à l'étiquette loop et l'on saute tout ce qui suit jusqu'à no_ramdrive.

Affectation de leur lettre d'unité au lecteur virtuel et au lecteur de CD

:no_shift

Nouvelle étiquette.

set ramd=%2

La boucle a été quittée après qu'il a été constaté l'égalité de %1 et d'errorlevel. La valeur de %2 est donc la lettre d'unité correspondant au disque virtuel. Elle est affectée à la variable d'environnement ramd. Comme la valeur de la variable cdrom est affectée à chaque itération de la boucle avant le double décalage et que dans la liste des paramètres les lettres sont en ordre alphabétique inverse, cdrom contient donc la lettre qui suit immédiatement celle affectée au disque virtuel. Si un lecteur de CD est présent, sa lettre d'unité est décalée d'un cran car c'est le disque virtuel qui se voit attribué la première lettre disponible après celles des disques durs.

Pour s'en convaincre il suffit de faire « tourner » ce programme en supposant que findramd a retourné la valeur 4 (cas de la présence d'un seul disque dur). La boucle est parcourue jusqu'à ce que %1 représente la valeur 4. Le disque virtuel a donc la lettre D (%2)et si un lecteur de CD est présent, il n'est plus en D comme en fonctionnement normal mais vu en E pendant tout le temps de fonctionnement avec la disquette.

if "%RAMD%"=="C" goto c_drive

Si la lettre d'unité attribuée au disque virtuel est C, il s'agit d'une anomalie, rendez-vous en c_drive.

Signalement des anomalies

goto success

Débranchement inconditionnel vers success pour sauter les lignes correspondant au signalement des anomalies.

:c_drive

Nouvelle étiquette correspondant à l'anomalie lettre C pour l'unité virtuelle.

echo Windows 98 a détecté que votre lecteur C ne contient pas de partition
echo FAT ou FAT32 valide. Il y a plusieurs causes possibles.
echo.
echo 1. Le disque doit être partitionné. Pour créer une partition sur le lecteur,
echo exécutez FDISK à partir de l'invite MS-DOS.
echo.
echo 2. Vous utilisez un logiciel de partition d'un autre éditeur. Dans ce cas
echo retirez la disquette de démarrage et redémarrez votre ordinateur.
echo Suivez ensuite les instructions à l'écran vous indiquant comment démarrer
echo à partir d'une disquette.
echo .
echo 3. Certains virus peuvent également empêcher la détection du disque C.
echo Vous pouvez utiliser un programme anti-virus pour vérifier la présence de
echo virus.
echo.

Affichage d'un texte explicatif sur l'anomalie rencontrée. Effectivement, si findramd a trouvé la lettre C pour le lecteur virtuel, c'est qu'il n'y a pas de disque dur en état de fonctionner normalement.

goto success

On saute la partie suivante liée aux autres cas d'anomalie.

:no_ramdrive

Étiquette pour les anomalies de code retour de findramd.

echo Il n'a pas été possible de créer un disque virtuel pour les outils de
echo diagnostic. Ceci peut être dû au fait que votre ordinateur ne dispose pas de
echo la quantité de mémoire étendue minimale nécessaire.
echo.

Affichage du texte correspondant.

Épilogue

:success

Étiquette de fin.

Conclusion

La création d'un fichier de commandes comme setramd requière une certaine expertise. Ceci démontre néanmoins que l'on peut réaliser des automates relativement sophistiqués avec de simples .bat.

 

Toutes les pages du site Les autres sites

accueil
aide en ligne sur les commandes
créer un menu de configuration dans le fichier config.sys
disquettes d'amorce
fichiers config.sys et autoexec.bat
fichiers de commandes
gestion de menus avec des fichiers de commandes
indicateurs de re-direction et conduit
LPT1 et les imprimantes USB
mode console, DOS émulé ou natif
noms courts et noms longs
personnalisation du DOS
prise en compte des ports USB
répertoires et dossiers
un CD boîte à outils
variables d'environnement

Tentatives de bonnes réponses à des questions qui peuvent ne pas l'être

 

Les bricolages de Heffgé