S1C4-3 Programme batch

SIO > S1_Commun > . > S1C3_Langage de commande > S1C3_DOS_3_batch.md

Les batch

Les batchs sont des "programmes" qui contiennent en fait une succession de commandes individuelles.
Ils permettent d'enchaîner des commandes simples mais aussi de prendre des décisions simples, de lancer des traitements adaptés à des conditions spéciales ou des traitements répétitifs.

Le langage de commande en batch ou en programmes shell ou powershell permet aussi d'utiliser des commandes spécifiques aux objets gérés comme les utilisateurs, le système de gestion LDAP (AD-DS Windows) la messagerie Linux etc. ...

Vous trouverez ici des nouvelles commandes mais aussi des exemples plus ou moins complexes et l'un ou l'autre exercice.

Pour suivre ce cours, il est impératif d'avoir vu les commandes en ligne du chapitre précédent.

Exemple de Batch

[dos]
cd c:/FTP
mkdir pub/private
mkdir pub/public
mkdir common/
mkdir Users/	
mkdir Users/toto	
mkdir Users/titi	
touch home.txt
echo Bienvenue sur le site de " > home.txt
copy home.txt Users/toto/welcome.html
copy home.txt Users/titi/welcome.html
echo toto  >> Users/toto/welcome.html
echo titi  >> Users/titi/welcome.html

Plusieurs commandes s'enchaînes afin d'exécuter un traitement pour parvenir à un résultat, ici, la création de l'arborescence du répertoire FTP et l'ajout du fichier welcome.html sur chaque compte.

Commandes spécifiques aux Batchs

Voici une liste des commandes spécifiquement utilisées dans les batch. Voir le détail et des exemples plus loin dans le cours.

Commande Description
IF Effectue un traitement conditionnel dans un fichier de commandes.
SET Affiche, définit ou supprime des variables d'environnement Windows.
ECHO Affiche des messages ou active/désactive l'affichage des commandes.
FOR Exécute une commande sur chaque fichier d'un ensemble de fichiers.
GOTO Indique l'exécution d'un fichier de commandes pour une ligne identifiée par une étiquette.
CALL Demande l'exécution d'un autre batch avant de reprendre la sucession des commandes.
PAUSE Interrompt l'exécution d'un fichier de commandes et affiche un message.
REM Insère un commentaire dans un fichier de commandes.
SHIFT Modifier la position des paramètres remplaçables dans un fichier de commandes.
SORT Trier les entrées.

(*) Commandes importantes
Les autres commandes du langage sont évidemment utilisables dans les batchs mais parfois, leur comportement change un peu : autre format de sortie, paramètre spéciaux, etc.

Les variables

Il est possible de définir des variables locales dans la fenêtre commande ou dans un batch afin de simplifier le travail.
Les variables sont définies à l'aide de la commande SET qui sert aussi à effectuer des calculs et à saisir des données au clavier.

Portée des variables

En DOS, une variable définie dans un batch est valable pour tout le batch, sans frontière (ce n'est pas le cas dans la programmation normale).

Définition

La commande SET permet de définir une variable ; Attention, pas d'espace entre le symbole = et le contenu !!! :

[dos]
SET maVariable =contenu de ma variable
Utilisation

On utilise une variable en encadrant le nom de la variable avec un symbole % : %maVariable% Lors de l'utilisation des variable, l'interpréteur remplace le nom de la variable par son contenu dans la commande à exécuter.

Le batch suivant effectue le même travail qu'avant mais à l'aide de variables :

[dos]
set ftp=c:/FTP
set users=%ftp%/Users
 
mkdir %ftp%/pub/private
mkdir %ftp%/pub/public
mkdir %ftp%/common/
mkdir %users%/toto	
mkdir %users%/titi	
 
set debut=bienvenue sur le site de 
echo %debut% toto >> %users%/toto/welcome.html
echo %debut% titi >> %users%/titi/welcome.html
Utilisation avancée

Set permet aussi de saisir des caractères au clavier (/P) et d'effectuer des calculs (/A) :

[dos]
@echo off
rem ==== test.bat =====
 SET /p unNombre=Saisir un nombre
 echo %unNombre%
 SET /a resultat=3 *(5 + %unNombre% )
 echo %resultat%

Résultat :

D:\_temp\Batchs_test>test.bat
Saisir un nombre123
123
384

Et voilà.

Les paramètres ou arguments

Il est possible de donner des arguments (ou paramètres) à un batch.
Soit le batch à qui lorsqu'on lui donne un nom, répond "bonjour xxx" avec xxx le nom donné. Le batch contient :

[dos]
set jour=date
echo bonjour %1, nous somme le %jour% 

  • Il crée une variable avec la date du jour,
  • prend la valeur contenue dans la variable automatique %1 et remplace "%1" par cette valeur dans la commande demandée.
  • Puis, il remplace %date% par sa valeur
  • Et exécute la commande echo.

Il est possible d'avoir jusqu'à 9 arguments, pas plus. Au delà, il faut utilise la commande shift pour décaler les arguments vers la gauche.
Le batch "bonjour.bat" suivant :

[dos]
rem === debut du batch bonjour.bat ===========
@echo off
echo Bonjour cher(e) %1
shift
echo et cher(e) %1
echo Bonne journée
rem === fin du batch ===========

Appelé comme suit, affiche ...

[dos]
>_ bonjour toto titi
	Bonjour cher(e) toto
	et cher(e) titi
	Bonne journée

Remarquer @echo off qui bloc l'affichage intermédiaire des commandes avant leur exécution et le @ qui bloque l'affichage de "echo off" elle-même.

Alternative : IF

L'alterntive sert à effectuer un traitement ou un autre selon le résultat d'une condition.
Format de la commande :

[dos]
@ECHO OFF
REM action simple
IF condition commande_si_condition_vraie	

REM multiples commandes
IF condition ( 				
   liste_de_commandes_si_vrai 
)

REM alternative complète
IF condition commande_si_vrai ELSE commande_si_faux 

REM alternative complète avec plusieurs commandes
IF condition ( 
   liste_de_commandes_si_vrai 
) ELSE (			# /!\ Les parenthèses doivent être sur la même ligne que le mot ELSE
   liste_de_commandes_si_faux 
)

Note : Il est possible d'écrire en minuscules, mais il est plus visuel de distinguer le langage du reste.

Exemple, algorithme :
Si le fichier FTP/pub/index.html existe, il faut le copier vers le répertoire de sauvegarde FTP_SAV/pub.
Sinon, il faut le créer avec un titre d'accueil standard (en html) :

[html]
	<h1>Bonjour et bienvenue dans l'espace de publications.</h1>

Pour cela, on utilise une alternative (IF).

[dos]
@echo off
rem =========================
IF exists FTP/pub/index.html
(
  copy FTP/pub/index.html FTP_SAV/pub/
) ELSE (
  echo "<h1>Bonjour et bienvenue dans l'espace de publications.</h1>" > FTP/pub/index.html
)
rem =========================

Les conditions

Une condition est une comparaison ou une commade dont le résultat est vrai ou faux.
Le commutateur /I, avant la condition, permet d'ignorer la casse des opérandes de la comparaison.

Opérateurs de comparaison

Ce sont des opérateurs classiques mais souvent exprimés avec 3 lettres :

Opérateur Symbole (en) Exemple
= EQU : égal à equal to "%annee%" EQU "2024"
= NEQ : différent de non equal to "%jour%" NEQ "45"
= LSS : inférieur à less than "%jour%" LSS "10"
= LEQ : inférieur ou égal à less or equal "%mois%" LEQ "12"
= GTR : supérieur à greather than "10" GTR "1"
= GEQ : supérieur ou égal à greater or equal "1000" GEQ "1000"

Important : la comparaison se fait caractère par caractère donc si une variable a une valeur nulle et qu'elle n'est pas entourée de délimiteurs quelconques, il y aura une erreur dans le batch.
Exemple : Soit le batch "test.bat" suivant :

[dos]
IF %1 EQU 3 echo valeur = 3

L'appel de ce batch sans paramètre donnera une erreur :

[dos]
test.bat 3
	valeur = 3
test.bat
	Erreur dans la commande if, absence d'un opérande

En effet, l'opérande est remplacé par sa valeur, soit ... rien donc la commande if devient bancale.
La solution est d'ajouter un ou deux délimiteurs quelconques :

[dos]
IF "%1" EQU "3" echo valeur = 3

Tests avancés

Ce sont des opérateurs classiques mais souvent exprimés avec 3 lettres :

Opérateur Symbole Exemple
Code retour d'un programme ERRORLEVEL IF ERRORLEVEL 1 commande
Existance d'un fichier ou dossier EXISTS IF EXISTS FTP/pub/index.html commande
Définition (existance) d'une variable (d'environnement) DEFINED IF DEFINED PATH commande

Ces commandes peuvent être précédées de NOT qui est la négation de la condition. Exemple :

[dos]
IF NOT EXISTS FTP/pub MKDIR FTP/pub

Gérer les sorties standard en batch.

Pour gérer les codes de sorties qui peuvent être réutilisés, rian de plus simple, on utilise la commande exit (avec /B pour ne pas fermer la fenêtre de commande).
Le code donne la valeur errorlevel du batch. Conventionnellement, on utilise souvent :

[dos]
	exit /B 0 # sortie normale, sans erreur
	exit /B 1 # sortie en erreur

Il suffit de choisir le niveau de sortie (Errorlevel) nécessaire.

Boucles de Cro magnon

Une boucle est un ensemble d'instruction qui est exécuté plusieurs fois. des tests permettent d'arrêter la boucle.
À la préhistoire de la programmation, la boucle classique n'existait pas. Le seul moyen de faire une boucle était d'utiliser une commande de débranchement de l'exécution séquentielle pour reprendre le traitement à une étiquette cible de la commande de débranchement.
La commande utilisée est GOTO, littéralement, en anglais "go to", "aller à".
Analyser le batch suivant :

[dos]
@echo off
rem définir un nombre entre 1 et 5 (X pour sortir)
SET /A NMax=%RANDOM% * 5 / 32768 + 1
 
%continuer
SET /P NB=donner un nombre entre 1 et %NMax%
IF '%NB% EQU %NMax% GOTO ok
IF '%NB% EQU 'X GOTO fin
GOTO continuer
 
%ok
echo Bravo!
%fin

Que fait ce batch ?

  • donner une description globale
  • donner une description précise du fonctionnement ligne par ligne.

Exercices

  • A l'aide d'un batch, contrôler et créer l'arborecence du répertoire FTP.
  • Si des fichiers html sont dans le répertoire FTP/common/, les supprimer
  • Si des fichiers html sont dans le répertoire FTP/common/, les supprimer
  • Rédiger un script qui affiche tous les entiers de 0 à N. Nest un argument fourni au batch.
  • Rédiger le script suivant :
    • le script initialise la variable 'tas' à 15
    • Il demande à l'utilisateur un nombre entre 1 et 3 et le retire du 'tas'
    • si le tas est égal à 1, le batch affiche le texte "BRAVO" et s'arrête.
    • le programme choisi un nombre entre 1 et 3 ou la valeur maxi du tas si elle est inférieure ou égale à 3 et l'affiche,
    • le programme retire aussi cette valeur du tas et montre le résultat.
    • si le tas est égale à 1, le batch affiche le texte "DOMMAGE".
    • si le tas est supérieur à zéro, retourner à la ligne où le programme demande un nombre à l'utilisateur.

Arrivé ici, vous avez acquis les bases essentielles du langage de commande. Mais voyons la suite ...

A SUIVRE ...

Partie 4 du cours DOS : La commande FOR en Batch.

Pour plus d'aventures, voir par exemple par ici : wikilivre::DOS. Par Toutatis, par Hasard et par Mesan! (il est tard...)