Вы попадаете в старую ловушку, не используя отложенное расширение.
Для быстрого решения, просто положить
setlocal enabledelayedexpansion
до этого цикла в пакетный файл и использовать !name!
вместо %name%
.
CMD расширяет переменные при разборе команды. Команда в этом смысле - это одна строка или «блок», ограниченная круглыми скобками. Полный цикл for
анализируется только один раз и на этом этапе %name%
заменяется на значение, имеющееся в этой точке, а именно "dummy"
. Отложенное расширение, с другой стороны, использует !
вместо %
, чтобы разграничить имена переменных и переменные, а затем развернуть их прямо перед выполнением команды.
Всякий раз, когда вы устанавливаете переменную в скобках в скобках и, используйте ее значение в том же блоке снова, вам нужно использовать отложенное расширение. help set
имеет также некоторую информацию об этом:
отложенной переменной среды расширение полезно для получения вокруг ограничений текущего расширения , которое происходит, когда строка текста для чтения, а не при ее выполнении. Следующий пример демонстрирует проблемы с немедленным переменной расширения:
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
в последнего найденного файла. переменная
отложенной среды расширение позволяет использовать различный характера (восклицательный знак), чтобы переменных окружения в время выполнения. Если задержка переменной расширение включено, вышеуказанные примеры можно записать следующим образом работать как задумано:
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%
Большое спасибо! Ты определенно спас мне мой день. fabio vitale –