Наконец, добавлена поддержка отложенного расширения переменных среды.Эта поддержка всегда отключена по умолчанию, но ее можно включить / отключить с помощью переключателя командной строки / 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, которое является составным утверждением.Таким образом, 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 для последнего найденного файла.
Отсроченное расширение переменной среды позволяет использовать другой символ (восклицательный знакmark) для расширения переменных среды во время выполнения.Если расширение отложенной переменной включено, приведенные выше примеры можно записать следующим образом, чтобы они работали как задумано:
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%