Un "batch file" (fichier de traitement en lot, souvent appelé simplement un fichier batch) est un simple fichier texte brut dont l'extension a été changée par .bat.
Un tel fichier est considéré comme "exécutable" par le système d'exploitation. Toutefois, il ne s'agit pas d'un fichier binaire contenant des instructions machines comme pour un .exe. On l'a dit, c'est un fichier texte et il n'est pas compilé, mais interprété. Lorsque vous codez en C++, vous utilisez un langage qui ne peut pas être compris directement par le processeur. Un compilateur transforme ce code en langage compréhensible par le processeur (un exécutable binaire qui dépend de la plateforme sur laquelle il a été compilé), et vous obtenez un .exe. Lorsque vous codez dans un fichier batch, vous utilisez du code et des commandes qui peuvent être comprises par le système d'exploitation (ici, Windows). On appelle cela un script et chaque système d'exploitation qui se respecte fournit un langage de scripts. Lorsque vous lancez un .bat, le fichier est interprété par l'interpréteur de commandes (ici, cmd.exe) qui relaiera des commandes au système d'exploitation au fur et à mesure de l'interprétation du code.
Comme il n'y a pas de compilation, créer un .bat est tout simple: on ouvre le bloc-notes de Windows (ou tout autre programme permettant de créer du texte brut), on écrit notre code dedans, et on sauvegarde le tout avec l'extension .bat.
On peut mettre dans un script n'importe quelle commande que l'on pourrait également taper directement dans cmd. Si c'est valide à la ligne de commande, c'est valide dans un batch. En plus, il existe des structures qui permettent de faire plus que d'envoyer des commandes une après l'autre et qui en font un petit langage de programmation en soi: des variables, des paramètres, des répétitives, des alternatives, etc.
Voici un exemple de fichier .bat tout simple:
tasklist /m > c:\test\a.txt copy c:\test\a.txt c:\test\b.txt echo La liste des processus a été créée en deux copies.
Note: la commande tasklist affiche à l'écran la liste de tous les programmes en ce moment en exécution sur l'ordinateur -- un peu comme ce que vous verriez dans le gestionnaire des tâches.
Note 2: le symbole >, dans cmd, est un symbole de redirection. Cela signifie que tout ce que la commande écrite avant aurait affiché à l'écran sera plutôt envoyé dans le fichier écrit après. Par exemple, ici, ce que tasklist aurait affiché à l'écran sera plutôt envoyé dans a.txt et rien ne sera affiché à l'écran. On peut utiliser la redirection avec n'importe quelle commande, dans un script ou directement à la console.
Note 3: si on veut faire en sorte qu'une commande n'affiche rien à l'écran, mais qu'on n'a pas réellement besoin de conserver sa sortie dans un fichier, on peut faire une redirection vers NUL. NUL est comme un trou noir: ce qu'on lui envoie est perdu et n'est pas conservé. Par exemple: copy a.txt b.txt > NUL fera la copie sans afficher l'habituel message "1 fichier(s) copié(s)".
Toute ligne qui commence par rem (remarque) est ignorée par Windows et sert uniquement à commenter le script pour le programmeur:
rem cette ligne est ignorée
À noter: on ne peut pas mettre le mot-clé rem au milieu d'une ligne pour mettre la fin en commentaire (comme on pourrait le faire en C++). Ici, rem est une commande et la commande doit se trouver au début de la ligne pour être valide. Du coup, une ligne est soit une remarque ou ne l'est pas, elle ne peut pas contenir des instructions et une remarque en plus. Par exemple, la ligne:
echo bonjour les amis rem cette ligne salue les amis
produira la sortie suivante:
bonjour les amis rem cette ligne salue les amis
ce qui n'est évidemment pas ce que l'on veut.
La commande echo permet d'afficher quelque chose à l'écran. On l'a déjà vu, la commande echo répète ce qu'on lui dit de répéter, ce qui était plus ou moins utile à la ligne de commande. C'est dans un script que ça prend tout son sens. Tout ce qui suit le mot echo (à part le premier espace) sera affiché à l'écran tel quel:
echo Ceci est un test d'echo plutôt "poche"
Il est inutile de mettre la phrase entre guillemets ou apostrophes – en fait, si on décide d'en mettre, ils seront simplement affichés eux aussi.
Notez l'utilisation spéciale du echo dans le cas où on veut afficher une ligne vide:
echo.
echo suivi d'un point (sans espace) saute une ligne. Utiliser echo tout seul ne saute pas une ligne, ça affiche plutôt si l'écho est allumé ou non...
En effet, vous aurez peut-être remarqué que jusqu'à présent, à chaque fois que cmd exécute un batch, il affiche chaque commande avant de l'exécuter. C'est ce qu'on appelle l'écho. On peut éteindre l'écho en faisant echo off et on peut le rallumer en faisant echo on. echo tout court nous affiche donc l'état de l'écho.
Comme on considère généralement que d'afficher les commandes à exécuter avant de les exécuter n'est pas particulièrement élégant, on éteindra l'écho en commençant le script. Le problème, c'est que la commande echo off sera affichée avant d'être exécutée puisqu'au moment où on l'exécute, l'écho est allumé... Afin d'éviter que tous nos scripts commencent par la mention "echo off", il y a un truc. On écrira:
@echo off
En effet, précéder une commande d'un @ nous assure que cette commande ne produira pas d'écho. L'écho sera donc éteint silencieusement et ceci gardera tout le reste du programme silencieux.
Dans un script, on peut utiliser des variables comme bon nous semble. Nous n'avons pas besoin de les déclarer au préalable, ni de leur définir un type de données, comme on doit le faire en C++.
On utilise une variable soit pour y écrire quelque chose (lui assigner une valeur), soit pour lire ce qui s'y trouve (lire sa valeur).
Lorsque l'on veut assigner une valeur à une variable, on utilise la commande set qui fonctionne ainsi:
set VARIABLE=valeur
À partir de ce moment, la variable VARIABLE contient la valeur valeur. Notez le nom de la variable en majuscules - c'est une convention, mais pas une obligation.
Lorsque l'on veut lire le contenu d'une variable, on doit l'entourer de deux symboles %. Par exemple, pour afficher à l'écran le contenu d'une variable, on fait:
echo %VARIABLE% echo Contenu de la variable VAR: %VAR%
Évidemment, il est toujours possible d'assigner le contenu d'une variable à une autre – à ce moment-là on lit le contenu de la première et on écrit dans la deuxième:
set VAR2=%VAR%
De là, il est facile d'ajouter quelque chose avant ou après le contenu d'une variable. Par exemple:
set VAR=bonjour set VAR2=%VAR% toi set VAR3=tiens, %VAR% toi echo %VAR% echo %VAR2% echo %VAR3%
Ce script produit la sortie suivante:
bonjour bonjour toi tiens, bonjour toi
Dans cet exemple, on assigne à une variable le contenu d'une autre auquel on ajoute quelque chose avant et/ou après. Rien ne nous empêche non plus d'ajouter du contenu à une variable en lui réassignant sa propre valeur à laquelle on ajoute quelque chose:
set VAR=bonjour %VAR%
Quelques points intéressants à vérifier – expérimentez sur la ligne de commande:
Qu'est-ce qui arrive si on oublie un % avant ou après le nom de la variable lorsque l'on veut lire son contenu? Qu'arrive-t-il si on oublie les deux?
Est-ce possible de donner à une variable une valeur numérique (comme par exemple 324)?
A-t-on besoin d'utiliser des guillemets lorsque l'on assigne une chaîne de caractère à une variable?
Est-ce possible d'assigner une chaîne de caractères contenant des espaces à une variable (comme par exemple la phrase: cette variable ne sert à rien)? Si oui, comment?
Est-ce possible de mettre des espaces avant et après le signe = lors de l'assignation? Testez avec un mot, une phrase et un nombre. Quelle est votre conclusion?
En Windows, toute variable est nécessairement une variable dite d'environnement, en ce sens qu'à partir du moment où elle est définie, elle est accessible par tout script et toute application, jusqu'à ce que la session soit terminée.
On peut voir le contenu de toutes les variables d'environnement présentement définies en faisant simplement set, sans paramètres:
set
Si on veut détruire une variable pour qu'elle cesse d'exister, on lui assigne simplement une valeur vide:
set VARIABLE=
Une variable qui n'a pas de valeur est considérée comme non définie et n'est pas conservée dans l'environnement.
Plusieurs variables d'environnement sont définies pour vous sur le système de façon standard. Lisez la liste et voyez les trucs qui pourraient vous être utiles!
Note: ces variables définies par le système sont en fait modifiables dans Windows. C'est Windows qui les recrée au démarrage à partir d'une liste qui lui a été fournie. Vous pouvez voir et éditer cette liste en cliquant avec le bouton de droite sur votre raccourci "Ordinateur", puis en choisissant Propriétés, puis Paramètres système avancés, onglet Paramètres système avancé (encore!), bouton Variables d'environnement.
Il existe une façon de faire réagir un script différemment selon qu'une condition quelconque soit vérifiée ou non: l'utilisation du if.
Un if de base est suivi d'une condition à vérifier, puis d'une commande à exécuter si la condition est vraie. Si la condition est fausse, la commande est simplement ignorée et le script continue son exécution à la ligne suivante. Par exemple:
if %VAR%==allo echo bonjour
Cette ligne vérifie si la variable VAR contient la valeur allo. Si c'est le cas, le mot bonjour sera affiché à l'écran. Sinon, rien ne sera affiché.
La négation
On peut vérifier l'inverse d'une condition en utilisant le mot-clé not juste après le if. Par exemple, si on voulait afficher bonjour uniquement lorsque VAR ne contient pas allo, on pourrait faire:
if not %VAR%==allo echo bonjour
Le not en fait, inverse simplement le résultat de la vérification: un faux devient vrai et un vrai devient faux.
Tester si une variable est vide
Pour tester si une variable est vide (ou non définie, ce qui revient au même), on peut simplement mettre la variable entre guillemets et la comparer à "". Par exemple:
if "%VAR%"=="" echo Variable non définie
En fait, les guillemets pourraient être remplacés par n'importe quels caractères. L'idée est que %VAR% est remplacé par sa valeur. Si cette valeur est nulle, le test devient:
if ""=="" echo Variable non définie
ce qui est effectivement vrai. Si la variable contient quoi que ce soit, le test sera faux.
Exécuter plusieurs instructions si la condition est vraie
Il est possible d'exécuter plus d'une instruction si la condition est vérifiée. Dans ce cas, on doit mettre toutes les instructions entre parenthèses. Par exemple:
if %VAR%==allo (echo bonjour echo c'est vraiment une belle journée VAR=ok)
Deux alternatives selon le résultat de la validation
Il est également possible d'exécuter certaines instructions si la condition est vraie ou certaines autres si elle est fausse. Un seul des deux blocs d'instructions sera alors exécuté à tous les coups. On n'a pour cela qu'à utiliser le mot-clé else. Pour pouvoir utiliser le else, on doit mettre l'instruction suivant le if entre parenthèses, même s'il n'y en a qu'une seule:
if %VAR%==allo (echo bonjour) else echo adieu
Notez que le else doit en plus être sur la même ligne que la dernière instruction du if... Autrement dit, ceci n'est pas valide:
if %VAR%==allo (echo bonjour) else echo adieu
C'est une syntaxe un peu capricieuse qui restreint la clarté... Une seule possibilité si on veut une syntaxe sur plusieurs lignes:
if %VAR%==allo ( echo bonjour ) else ( echo adieu )
On peut en effet mettre les parenthèses sur la ligne suivante si on veut. Ça paraît un peu étrange mais c'est plus proche de la syntaxe du C++...
Les opérateurs relationnels
Lorsque l'on compare des valeurs numériques, on veut parfois savoir si une valeur est plus petite ou plus grande qu'une autre – on ne teste pas que l'égalité. On peut aussi vérifier si un mot vient avant un autre, alphabétiquement parlant (bien que ça soit plus rare).
Les symboles < et > ne sont pas valides dans une comparaison, malheureusement, puisqu'ils sont des symboles réservés pour la redirection. On doit alors utiliser les mots-clés suivants:
LSS |
Less than |
Plus petit que |
LEQ |
Less than or equal |
Plus petit ou égal |
GTR |
Greater than |
Plus grand que |
GEQ |
Greater than or equal |
Plus grand ou égal |
EQU |
Equal |
Égal |
NEQ |
Not equal |
Différent de |
Remarquez que EQU produit le même effet que ==, on peut l'utiliser pour comparer des nombres ou des chaînes de texte. Et NEQ produit le même effet que not suivi d'un test d'égalité...
Vérifier l'existence d'un fichier
Le if permet également de vérifier si un fichier existe (ou donc s'il n'existe pas). Pour ce faire on utilise le mot-clé exist:
if exist c:\bonjour.txt echo le fichier existe if not exist c:\bonjour.txt echo le fichier n'existe pas
Le dernier exemple l'utilise en conjonction avec not, ce qui est toujours possible.