Enfin, la prise en charge de l'expansion retardée de variables d'environnement a été ajoutée. Cette prise en charge est toujours ...

Enfin, la prise en charge de l'expansion retardée de variables d'environnement a été ajoutée. Cette prise en charge est toujours désactivée par défaut, mais peut être activée/désactivée via l'option de ligne de commande /V dans CMD.EXE. Voir CMD /?  La prise en charge de l'expansion retardée de variables d'environnement est utile pour contourner les limites de l'expansion en cours qui se produit à la lecture d'une ligne de texte et non à son exécution. L'exemple suivant montre le problème causé par l'expansion immédiate de variables :      set VAR=avant     if "%%VAR%%" == "avant" (         set VAR=après         if "%%VAR%%" == "après" @echo Cela marche si vous lisez ce message     )  n'affichera jamais le message car la variable %%VAR%% présente dans les deux instances de IF est remplacée à la lecture de la première instance de IF, étant donné que le corps de IF, instruction composée, est logiquement inclus. Donc le IF compris dans l'instance compare "avant" avec "après" et il n'y aura jamais égalité. De même, l'exemple suivant ne fonctionnera pas comme prévu :      set LIST=     for %%i in (*) do set LIST=%%LIST%% %%i     echo %%LIST%%  car la liste des fichiers du répertoire ne sera PAS créée, et en fait la variable LIST prendra le valeur du dernier fichier trouvé. Une fois encore cela est dû au fait que %%LIST%% n'est étendu qu'une fois, lorsque FOR est lu et à ce stade la variable LIST est vide. Donc la boucle FOR exécutée est :      for %%i in (*) do set LIST= %%i  qui donne toujours à LIST la valeur du dernier fichier trouvé.  L'expansion retardée de variables d'environnement vous permet d'utiliser un autre caractère (le point d'exclamation) afin d'étendre les variables d'environnement durant l'exécution. Si l'expansion retardée de variables est activée, les exemples ci-dessus peuvent être écrits comme suit afin de fonctionner comme vous le souhaitez :      set VAR=avant     if "%%VAR%%" == "avant" (         set VAR=après         if "!VAR!" == "après" @echo Cela marche si vous lisez ce message     )      set LIST=     for %%i in (*) do set LIST=!LIST! %%i     echo %%LIST%%