Commandes DOS

Introduction modifier

La commande SET permet d'afficher ou de modifier une variable d'environnement.

Il est à noter que toutes les versions de MSDOS ne supportent pas forcement les implémentations qui vont suivre. C'est surtout à partir de NT5 (W2000 XP W2003) que le CLI "Command Line Interpreter" commence vraiment à s'étoffer.

Utilisation modifier

Affichage de variables modifier

SET [nom de variable]

Si aucun nom de variable n'est indiqué, la commande affiche toutes les variables d'environnement avec leur contenu. Ceci est utile pour chercher une variable telle qu'un répertoire utilisateur.
Si un nom est indiqué, la commande liste toutes les variables commençant par ce nom

Affectation de variables modifier

Les variables sont très utiles dans un environnement de script ou batch (un programme).

Affectation de chaînes modifier

la commande SET permet d'affecter une valeur à une variable nommée. Exemple :

SET X=unechainedecaractère

la variable X vient d'être initialisée avec la valeur "unechainedecaractère".
Chaque instanciation de la console (on peut exécuter cmd.exe plusieurs fois simultanément sous Windows) possède son propre environnement (une zone mémoire) dans lequel sont stockées toutes les variables.

 @echo off
 cls
 echo.
 
 SET monnom=byby
 echo monnom : %monnom%
 rem permet d'initialiser et d'afficher la variable monnom sur la console à la valeur "byby".
 
 SET monprenom=titi
 echo monprenom : %monprenom% monnom : %monnom%
 
 SET nomcomplet=%monprenom% %monnom%
 echo nomcomplet : %nomcomplet%
 rem voilà la concaténation de deux variables en une seule
 pause

 

Contrairement à beaucoup d'autres langages de programmation, le signe égal de la déclaration ne peut pas être précédé ou suivi d'un espace.





Affectation d'expressions numériques modifier

Le commutateur /A permet d'évaluer des expressions numériques. Par exemple:

SET /A X=3+2

Ceci affecte 5 à la variable d'environnement X. Si le commutateur n'était pas présent, X aurait pris la chaine 3+2 sans faire le calcul, et ce, quelle que soit l'utilisation ultérieure de la variable dans l'environnement.

Les expressions utilisent les caractères suivants:

( ) + - * / % << >> & ^ ,

Les opérandes constituant l'expression à calculer peuvent être écrits en notation décimale, hexadécimale ou octale. Cela peut générer des erreurs de calculs ou des messages d'erreur pas toujours très clairs.

SET /A A=1+0099

Retourne un message d'erreur :

Nombre non valide. Les constantes numériques doivent être 
soit décimales (17), soit hexadécimales (0x11), soit octales (021).

Tout nombre commençant par zéro (tel 0099) est considéré comme octal (chiffre de 0 à 7 inclus). Donc 8 et 9 ne peuvent apparaitre dans un tel nombre.

La commande correcte est la suivante :

SET /A A=1+99

Affectation utilisateur modifier

Le commutateur /P permet d'initialiser une variable par une entrée clavier utilisateur.

SET /P variable=message

Cette commande affiche à l'écran le message, et attend que l'utilisateur donne une chaîne de caractères qui sera alors mémorisée dans la variable.

Suppression de variables modifier

SET monnom=

Supprimera la variable "monnom" de l'environnement (la mémoire), en d'autres termes cela libèrera l'espace mémoire occupé par la variable.

Manipulation de variables modifier

Pour récupérer la valeur d'une variable il suffit d'entourer son nom par des %. Par exemple:

SET monnom=Ceci est un essai

ECHO %monnom%

Il est possible de ne récupérer qu'une partie de la chaîne de caractère contenue dans une variable d'environnement. Par exemple :

ECHO %monnom:~5%

Ceci récupère la chaîne à partir du caractère 5 jusqu'à la fin

ECHO %monnom:~5,2%

Ceci récupère la chaîne à partir du caractère 5 jusqu'aux 2 caractères suivants.

Si la valeur indiquée est négative, cela signifie un indexage à partir de la fin de la chaine :

ECHO %monnom:~2,-2%

Ceci récupère la chaîne du 2ème caractère en partant du début jusqu'au 2ème caractère en partant de la fin.

Il est possible de rechercher un chaine dans une variable et de la remplacer par une autre :

SET chaine_resultante=%chaine_a_traiter:chaine_recherchée=[chaine_de_remplacement]%

Ainsi avec la commande suivante, il est possible d'éliminer l'extension .bat du nom d'un fichier :

set A="monfichierbatch.bat"
set A=%A:.bat=%

Variables prédéfinies modifier

Lorsqu'une console de commandes DOS est lancée, certaines variables sont déjà définies.

Variables d'information système modifier

Afin de connaître ces variables, il suffit de lister toutes les variables (dépendantes de l'OS) pour y repérer celles qui peuvent servir :

Nom de variable Signification
%PATH% Liste des répertoires où chercher les applications par défaut
%WINDIR% Répertoire de windows
%USERPROFILE% Répertoire utilisateur
%USERNAME% Nom de l'utilisateur
%TEMP% Répertoire temporaire
%OS% Nom de l'OS

Variables dynamiques modifier

Certaines variables sont des variables dynamiques du système, c'est-à-dire que leur valeur est modifiée automatiquement selon les changements de contexte ou recalculée à chaque lecture.

Nom de variable Signification
%CD% Répertoire courant
%DATE% Date courante (même résultat que DATE /T)
%TIME% Heure courante (même résultat que TIME /T)
%RANDOM% Nombre pseudo-aléatoire compris entre 0 et 32767
%ERRORLEVEL% Erreur de la commande précédente

Les paramètres de commande modifier

%0 %1 %2... %9 correspondent à la commande (%0) et aux arguments ou paramètres ou commutateurs (%1 à %9) qui suivent la commande (séparés par des espaces) %* contient l'ensemble des paramètres %1 à %9.

Ils permettent de passer des variables au sein d'un fichier batch (traitement par lot) introduit par l'utilisateur au moment du lancement de la commande (d'où le nom de commutateur). À noter : %0 contient toujours le nom du fichier de commande qui est exécuté actuellement (tel qu'il a été saisi en ligne de commande ; ainsi, si on saisit "test" pour exécuter "c:\windows\system32\test.bat", $0 contiendra "test" seul).

Echo %0
Echo %*

Exemple modifier

Le script suivant est un jeu montrant quelques utilisations de la commande SET

@ECHO OFF
CLS


SET /A val=%RANDOM%

SET /A val2=%val% / 1000
SET /A val=%val% - %val2% * 1000
SET /A val2=%val% / 100
SET /A val=%val% - %val2% * 100
SET /A val2=%val% / 10
SET /A val=%val% - %val2% * 10


SET /A nbEssais=3
ECHO Devinez un nombre compris entre 0 et 10
ECHO ---------------------------------------

:debut
SET /P n=Votre nombre : 

SET /A nbEssais-=1

IF %n%==%val% GOTO finGagne
IF %nbEssais%==0 GOTO finPerdu

ECHO ----- Perdu. Nouvel essai
GOTO debut

:finGagne
ECHO Bravo ! Vous avez gagné
GOTO fin

:finPerdu
ECHO Perdu ! Il fallait trouver %val%
GOTO fin

:fin
PAUSE

La première variable utilisée est val contenant la valeur à rechercher. Elle est initialisée avec la variable dynamique RANDOM que l'on divise par 1/10ème de la valeur maximale aléatoire possible, afin d'avoir un nombre compris entre 0 et 9.
La deuxième variable utilisée est nbEssais contenant le nombre d'essais laissés à l'utilisateur pour trouver le nombre. Elle est initialisée à 3 et décrémentée de 1 à chaque demande grâce à l'opérateur -=
La troisième variable utilisée est n contenant la valeur entrée par l'utilisateur. Cette variable est initialisée avec le commutateur /P afin de demander une entrée clavier.

Exemple 2 modifier

Il s'agit lors de la sauvegarde de toute ou partie du système de créer un nom de fichier unique structuré comme suit: NOMFICHIER_DATA_TIME_RANDOM

SET YYYYMMDD=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
REM inverse la variable %DATE% pour obtenir une date en Année mois jour bien plus facile à trier

for /F "tokens=1,2,3,4,5,6 delims==:.-/, " %%A in ("%TIME%") do SET MYTIME=%%A%%B%%C%%D%%E%%F
REM cette boucle permet de filtrer la variable %TIME% afin d'en éliminer tout caractère indésirable
REM dans un nom de fichier. On suppose que %TIME% se divise en 6 parties délimitées par [:.-/, ].
REM le nombre de parties et les délimiteurs n'ont pas à être exacts, il suffit qu'ils couvrent  
REM le problème.
     
SET FILEUID=NOMFICHIER_%YYYYMMDD%_%MYTIME%_%RANDOM%
REM enfin on rajoute un nombre aléatoire au nom du fichier afin de le rendre unique