# DOS/Set

Commandes DOS :

## Introduction

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
### Affichage de variables

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

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

#### Affectation de chaînes

la commande SET permet d'affecter une valeur à une variable nommée. Exemple :
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.
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

Le commutateur /A permet d'évaluer des expressions numériques. Par exemple:
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.
Retourne un message d'erreur :
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 :

#### Affectation utilisateur

Le commutateur /P permet d'initialiser une variable par une entrée clavier utilisateur.
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

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

Pour récupérer la valeur d'une variable il suffit d'entourer son nom par des %. Par exemple:
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 :
Ceci récupère la chaîne à partir du caractère 5 jusqu'à la fin
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 :
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 :
Ainsi avec la commande suivante, il est possible d'éliminer l'extension .bat du nom d'un fichier :

### Variables prédéfinies

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

#### Variables d'information système

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

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

%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).

## Exemple

Le script suivant est un jeu montrant quelques utilisations de la commande SET
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

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