Vous rencontrez le problème de l'expansion de variable statique de cmd. La variable MODE est seulement évaluée une fois. Vous pouvez le voir si vous omettez la ligne hors ligne @echo.
Finally, support for delayed environment variable expansion has been added. This support is always disabled by default, but may be enabled/disabled via the /V command line switch to CMD.EXE. See CMD /?
Delayed environment variable expansion is useful for getting around the limitations of the current expansion which happens when a line of text is read, not when it is executed. The following example demonstrates the problem with immediate variable expansion:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
would never display the message, since the %VAR% in BOTH IF statements is substituted when the first IF statement is read, since it logically includes the body of the IF, which is a compound statement. So the IF inside the compound statement is really comparing "before" with "after" which will never be equal. Similarly, the following example will not work as expected:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
in that it will NOT build up a list of files in the current directory, but instead will just set the LIST variable to the last file found. Again, this is because the %LIST% is expanded just once when the FOR statement is read, and at that time the LIST variable is empty. So the actual FOR loop we are executing is:
for %i in (*) do set LIST= %i
which just keeps setting LIST to the last file found.
Delayed environment variable expansion allows you to use a different character (the exclamation mark) to expand environment variables at execution time. If delayed variable expansion is enabled, the above examples could be written as follows to work as intended:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo If you see this, it worked
)
set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%
Y at-il un moyen de mettre le drapeau programatically au sommet d'un fichier de chauve-souris? La plupart du temps, ceci sera exécuté soit par un autre fichier bat, et l'environnement dans lequel il est exécuté n'est pas corrigé (il peut être double-cliqué, peut être exécuté à partir d'un shell cygwin, peut-être à partir de cmd, etc.). – Herms
@Herms, "setlocal enabledelayedexpansion" au début, "endlocal" à la fin. – paxdiablo
Merci. Cela a sauvé mes fesses paxdiablo. –