DOS/Set
Introduction
modifierLa 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
modifierAffichage de variables
modifierSET [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
modifierLes variables sont très utiles dans un environnement de script ou batch (un programme).
Affectation de chaînes
modifierla 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
modifierLe 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
modifierLe 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
modifierSET 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
modifierPour 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
modifierLorsqu'une console de commandes DOS est lancée, certaines variables sont déjà définies.
Variables d'information système
modifierAfin 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
modifierCertaines 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
modifierLe 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
modifierIl 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