DOS Batch

04/04/2014 10:09

Les fichiers BATCH

Un fichier BATCH, ou fichier de commande, est un regroupement de commandes. Dans un fichier BATCH, nous pouvons utiliser des commandes qui seraient inutiles en saisie directe. C'est le cas des commandes conditionnelles, d'affichage, d'attente, de branchement et aussi de boucle. Un fichier BATCH (*.BAT) peut être exécuté comme une commande externe, avec des paramètres, si vous en avez l'utilité.

Les quelques paragraphe qui suivent, listerons les commandes internes relatif au programme BATCH : "Echo", "For", "Goto", "If", "Pause", "Rem", "Shift", "Call", "Break" ...

  1. Création

Pour créer un fichier BATCH, je vous conseille d'utiliser le programme EDIT du DOS. Exemple commenté d'un fichier de commande :

@Echo off
Cls
Echo Coucou, c'est moi.
Pause
Ver

La première ligne est pour moi indispensable. Elle indique à l'interpréteur de ne pas afficher sur l'écran les commandes qui vont être exécutées. Cela permet une transparence du traitement. Vous pouvez l'enlever ou bien la mettre en remarque (ce qui revient au même) en insérant "REM" devant "@Echo off" pour rétablir l'affichage des commande exécuter. Je pense que vous devriez essayer pour comprendre le phénomène. La deuxième ligne efface l'écran ; rien d'extraordinaire. Ensuite, nous affichons un message à l'écran avec la commande "ECHO" puis nous attendons l'appui d'une touche. Et pour terminer, nous affichons la version du DOS. Moralité, ce programme (fichier de commande) n'a aucune utilité autre que d'être un exemple.

 

 

-----Voir plus tard -----  !!

 

  1. Echo, et @

La commande "Echo" permet d'affiche à l'écran une ligne de texte. Je dis "une ligne", car une fois le texte affiché, il y a automatiquement un retour à la ligne : c'est-à-dire, que deux commande "echo" à la suite, afficherons deux lignes l'une en dessous de l'autre. La commande "echo" permet aussi d'informer interpréteur de commande, que nous ne désirons pas qu'il affiche les lignes du programme BATCH. La commande "@" permet d'informer l'interpréteur que la ligne ne doit pas être affiché à l'écran, même si la commande "echo" est sur "on".

Syntaxe : "Echo off" pour ne pas affiché les lignes du fichier de commande. La commande "echo" est sur "on" par défaut.

  1. REM, Remarque

Dans un fichier de commande, vous pouvez insérer des commentaires, grâce à la commande interne "REM".

  1. Break

La commande interne "Break" autorise (ou non) l'utilisateur d'interrompre un fichier de commande avec les touches d'interruption "CTRL-C" ou "CTRL-BREAK".

Syntaxe : "Break ON/OFF"

  1. Les paramètres (arguments)

Un fichier BATCH peut avoir plein de paramètres, à concurrence de 127 caractères sur la ligne de saisie. Dans le fichier, nous ne pouvons accéder qu'à dix paramètres à la fois avec les variables argument %0, %1, %2, %3, ... , %9. La variable %0 représente à l'origine, le nom du fichier BATCH, ou plus précisément la saisie au prompt du nom avec le chemin tapé. Pour atteindre les autres paramètres, nous devrons utiliser la commande interne "SHIFT", qui permet de cycler les paramètres. Ainsi, le contenu de la variable %1 sera positionné dans la variable %0, ..., le contenu de %9 dans %8, et ainsi, le paramètre suivant qui n'était pas accessible sera placé dans %9.

  1. Les variables

Avec la commande interne "SET", vous pouvez définir et affecter des variables textes. Ces variables sont conservées tant qu'elles ne sont pas effacées, même après la fin d'un fichier BATCH. Ce ne sont pas des variables locales au fichier de commande, mais bien des variables globales. Exemple : "SET V=M??E.*" définit et affecte la variable texte "V" de la valeur "M??E.*". Pour changer de valeur, il suffi d'affecter de nouveau la variable : "SET V=LO*.*". Puis, pour effacer la variable, il suffira d'affecter une valeur vide : "SET V=".

Une fois cette variable définie, nous pouvons accéder à son contenu en utilisant son nom entre deux caractères pour-cent : "Echo %V%" affiche le contenu de la variable "V".

Je vous conseille d'effacer vos variables dès que vous n'en avez plus besoin.

Attention. Il existe d'autres variables qui sont utilisées en locale ; elles sont du format "%i" ou "%%i", cela dépend de interpréteur, et de sa version. On les trouve dans les boucles "FOR" par exemple (défini plus loin). J'ai pris "i" comme exemple ; vous pouvez utilisez un autre nom.

  1. Label / branchement

Un label est un marqueur désignant une ligne dans un fichier de commande. Un label est utilisé de paire avec la commande de branchement "GOTO". Un label commence par un caractère deux points, suivit d'un nom. Exemple :

@Echo Off
... ...
Goto L1
... ...
:L1
... ...

Lorsque l'interpréteur rencontre la commande "GOTO L1", il poursuit sont interprétation après la ligne désignée par le label (il saute au label).

  1. Test

Un test, c'est la possibilité d'exécuter un traitement si le résultat comparant deux éléments est vérifié. Il est engendré par la commande "IF" dont voici ces paramètres et sa structure :

IF [NOT] ERRORLEVEL nombre commande
IF [NOT] chaîne1==chaîne2 commande
IF [NOT] EXIST fichier commande

NOT

Spécifie que interpréteur exécute la commande seulement si la condition est fausse

ERRORLEVEL nombre

Condition vraie si le dernier programme exécuté a renvoyé un code de sortie supérieur ou égal au nombre spécifié.

Commande

Commande à exécuter si la condition est satisfaite.

Chaîne1==chaîne2

Condition vraie si les chaînes spécifiées concordent.

EXIST fichier

Condition vraie si le fichier spécifié existe.

Exemple de code :

@echo off
IF "%1"=="" GOTO Err
Echo Le paramètre est : "%1"
Goto Fin
:Err
Echo Entrez un paramètre.
:Fin

  1. Boucle

Une boucle, c'est la possibilité de répéter plusieurs fois une opération sur un élément d'un ensemble définit. Souvent, l'ensemble est défini avec les noms de fichier, mais il peut aussi être du texte, voir des paramètres. Cette boucle est engendrée par la commande "FOR" dont voici la syntaxe :

FOR %variable IN (ensemble) DO commande [paramètre]

%variable

Paramètre remplaçable.

(ensemble)

Ensemble de fichiers séparés par des espaces. Caractères génériques permis.

Commande

Commande à exécuter pour chaque fichier.

paramètre

Paramètres ou commutateurs pour la commande spécifiée.

Pour utiliser FOR dans les fichiers de commandes, spécifiez %%variable au lieu de %variable.

Exemple compliqué : recherche la localisation de lui-même (le fichier BATCH) sur les disques du système. Nous admettrons que l'utilisateur saisisse au prompt seulement le nom du fichier de commandes.

Set DD_OLI=
For %%i in (C D E F G) do If "%DD_OLI%"=="" If exist %%i:\BATCH\%0.BAT SET DD_OLI=%%i

J'initialise à vide la variable DD_OLI, au cas où elle existerait déjà. Puis, je recherche successivement dans les disques durs la présence du fichier de commande (moi-même, vu par le fichier). Dès que je me trouve, j'affecte la variable DD_OLI du nom de l'unité dans lequel je me suis trouvé. — Il est possible que je trouve un fichier portant le même nom que moi, sans pour cela que se soit moi ! Certes, mais sur mon propre ordinateur, j'évite autant que je peux, d'avoir des fichiers de commande portant le même nom. Pourquoi rechercher la localisation du fichier de commande ? parce que ce disque est amovible, et qu'il peut porter n'importe quelle lettre de lecteur, lorsqu'il est inséré dans un autre ordinateur. - Une fois le fichier de commande trouvé, la variable DD_OLI est affecté. Dès lors, le test d'existence ne sera plus effectué car DD_OLI n'est plus vide. Comme il n'est pas possible de quitter la boucle, j'utilise un test sur le contenu de la variable. S'il était possible de quitter la boucle, j'aurai plutôt écris un truc du genre :

For %%i in (C D E F G) do If exist %%i:\BATCH\%0.BAT GOTO Trouvé
  1. Call

Dans un fichier BATCH, on peut désirer faire traiter une opération par un autre fichier de commande déjà existant. Pour cela, nous utiliserons la commande interne "CALL" suivie du nom du fichier de commande. Si nous omettons cette commande, le fichier BATCH ainsi appelé interrompt automatiquement l'exécution de l'appelant. C'est-à-dire, que la commande "CALL" informe l'interpréteur d’exécuter un BATCH comme étant un sous-programme. Sinon, l’appelle sera interprété comme étant un branchement conditionnel ou un saut (goto) dans un nouveau programme.

  1. Pause

La commande "PAUSE" affiche un message à l'écran, jusqu'à ce que l'utilisateur appui sur une touche. Il est possible de ne pas affiché le message, en le détournant avec un filtre, vers une sortie nulle : "PAUSE >NUL", attends l'appui d'une touche, sans afficher le message. L'information sur ce sujet sera donnée dans le paragraphe des filtres.

  1. Choice / ErrorLevel

Le programme "CHOICE", intégré dans le MS-DOS depuis la version 5.x (je pense), permet à un utilisateur de concevoir un menu dans un fichier BATCH. Ce programme retourne un code de sortie de programme (code d'erreur, plus précisément) suivant la touche enfoncée. Il est désolant de remarquer l'ajout de ce programme, or qu'il aurait sûrement été plus intelligent de faire évoluer la commande "PAUSE" dans ce sens, vu qu'elle ne prend actuellement aucun paramètre dans l'interpréteur MS-DOS (ce qui n'est pas forcément le cas dans d'autres interpréteurs). Pour gérer ces codes de retour, la commande "IF" possède une instruction spécifique : "ErrorLevel". Cette instruction est vérifiée, si le code d'erreur retourné par le dernier programme exécuté est supérieur ou égal à la valeur spécifié. Un exemple sera sûrement plus parlant.

@Echo Off
:Menu
Cls
Echo 1) Idos 2) EdiPage
Choice /C:12² /N Quel programme voulez vous lancer [² pour quitter]:
If ErrorLevel 3 Goto Fin
If ErrorLevel 2 goto l2
If ErrorLevel 1 goto l1
Goto Menu

:L1
C:\OUTILS\IDOS
Goto Menu
:L2
C:\OUTILS\EdiPage
Goto Menu
:Fin

D'après la documentation Microsoft, "CHOICE" retourne un "ErrorLevel 0" à la suite d'une interruption par les touches de contrôle CTRL-C ou CTRL-BREAK. Après essai, il semble que "CHOICE" retourne l'erreur 255 (de même, lorsqu'une erreur se produit).

  1. Exemple utile

Ajouter un chemin à la variable "PATH", pour la recherche de programme exécutable.

@echo off
If "%1"="" GOTO Err
Set PATH=%1;%PATH%
Goto Fin
:Err
Echo %0 [nouveau chemin de recherche]
:Fin