Вы столкнулись с проблемой расширения статической переменной cmd. Переменная MODE оценивается только один раз. Вы можете увидеть это, если опустите @echo off line.
Наконец, добавлена поддержка отложенного раскрытия переменных среды. Эта поддержка всегда отключена по умолчанию, но ее можно включить/выключить с помощью переключателя командной строки /V в CMD.EXE. См. CMD/?
Отложенное расширение переменной среды полезно для обхода ограничений текущего расширения, которое происходит при чтении строки текста, а не при ее выполнении. Следующий пример демонстрирует проблему с немедленным расширением переменной:
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "%VAR%" == "after" @echo If you see this, it worked
)
никогда не отобразит сообщение, так как %VAR% в ОБОИХ операторах IF заменяется при чтении первого оператора IF, поскольку он логически включает в себя тело IF, которое является составным оператором. Таким образом, ЕСЛИ внутри составного оператора на самом деле сравнивает «до» с «после», которые никогда не будут равны. Точно так же следующий пример не будет работать должным образом:
set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
в том, что он НЕ будет создавать список файлов в текущем каталоге, а вместо этого просто установит переменную LIST в последний найденный файл. Опять же, это потому, что %LIST% расширяется только один раз, когда читается оператор FOR, и в это время переменная LIST пуста. Таким образом, фактический цикл FOR, который мы выполняем, выглядит следующим образом:
for %i in (*) do set LIST= %i
который просто устанавливает LIST для последнего найденного файла.
Отложенное раскрытие переменной среды позволяет использовать другой символ (восклицательный знак) для раскрытия переменных среды во время выполнения. Если включено раскрытие переменной с задержкой, приведенные выше примеры можно было бы написать следующим образом, чтобы они работали должным образом:
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%