Вы столкнулись с проблемой расширения статической переменной 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, который мы выполняем:
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%