Пакетный файл ENABLEDELAYEDEXPANSION не записывает переменные

У меня есть приведенный ниже фрагмент кода, который выводит переменную в текстовый файл. %drone% будет простой текстовой строкой, а %counter% — числом, которое находится в цикле для подсчета итераций.

echo %drone% !counter! отображает правильные значения на экране, но в коде echo Done: %drone% Files deleted: !tempcounter! >> clearTempFilesonDrones.txt переменная !tempcounter! пуста при выводе в файл.

Я пытался установить временную переменную и использовать %tempvariable%, но это не сработало. Я также пробовал "!counter!" на случай, если он подумает, что это строка, а не просто число, но это тоже не сработало.

echo %drone% %counter%
endlocal

echo Done: %drone% Files deleted: !counter! >> clearTempFilesonDrones.txt

Любые идеи?

Я не могу скопировать весь код в pastebin или что-то подобное, так как он заблокирован в текущем клиенте, поэтому просто загрузил фрагмент.


person Brian Folan    schedule 29.08.2016    source источник
comment
Это нехватка информации, вы должны предоставить больше кода (пожалуйста, обратитесь к этот раздел справки), и вы должны описать, что вы подразумеваете под не' т работать; в любом случае, где-то должна быть команда setlocal EnableDelayedExpansion; помимо включения отложенного расширения, это начинает локализацию изменений среды, поэтому все установленные или измененные переменные теряются, как только endlocal завершает локализацию; Я предполагаю, что tempcounter установлен между setlocal и endlocal, не так ли?   -  person aschipfl    schedule 29.08.2016


Ответы (2)


Похоже, что поведение setlocal без или с 1 или 2 из 4 необязательных параметров и endlocal на самом деле вам не известно.

Смотрите ответы на

которые подробно описывают с примерами, что на самом деле делают setlocal и endlocal.

Текущие значения переменных среды drone и counter должны быть переданы из текущей таблицы переменных среды, удаленной endlocal, в восстановленную таблицу переменных среды, активную до setlocal и снова активную после endlocal.

Это можно сделать следующим образом:

echo %drone% %counter%
endlocal & set "drone=%drone%" & set "counter=%counter%"

echo Done: %drone% Files deleted: %counter% >>clearTempFilesonDrones.txt

Вся командная строка с командой endlocal и двумя командами set сначала предварительно обрабатывается командным процессором Windows со значениями текущей переменной среды, в результате чего ссылки на переменные заменяются их текущими значениями. Итак, строка после предварительной обработки:

endlocal & set "drone=value of drone variable" & set "counter=counter value"

Теперь выполняется первый endlocal, который отбрасывает текущую таблицу переменных среды и восстанавливает предыдущую таблицу переменных среды. Затем выполняются две команды set, которые назначают две строки двум переменным в теперь активной таблице переменных среды.

Объяснение оператора & см. в ответе на Одна строка с несколькими командами с использованием пакетного файла Windows.

Далее я предлагаю открыть окно командной строки, выполнить там следующие команды и очень внимательно прочитать полностью все страницы справки, отображаемые для каждой команды.

  • endlocal /?
  • set /?
  • setlocal /?

Встроенная справка не такая подробная, как упомянутые ответы, но тем не менее ее следует прочитать.

person Mofi    schedule 29.08.2016
comment
Это работает... Согласно предыдущему комментарию к другому сообщению, у меня был endlocal в конце скрипта, и я переместил его вверх, когда попытался установить новую переменную в мое значение %counter%. Я предполагаю, что мне нужно было сделать это в той же строке. Благодарю вас! - person Brian Folan; 30.08.2016

ваш endlocal завершает отложенное расширение, то есть вы не можете использовать ! переменные впоследствии больше. попробуйте просто использовать

echo Done: %drone% Files deleted: %counter% >> clearTempFilesonDrones.txt

Обратите внимание, что переменные, к которым сначала обращаются с помощью !temp! в блоке кода, впоследствии могут быть доступны с помощью обычного %temp%.

Если это не сработает, я предлагаю попробовать удалить endlocal или поместить его в строку ниже последнего эха.

person Dennis van Gils    schedule 29.08.2016
comment
Обратите внимание, что endlocal также удаляет все переменные, которые были изменены с момента предыдущего setlocal; это означает, что после endlocal переменные результата могут иметь разные значения, даже если они отображаются с % вместо !. - person Aacini; 29.08.2016
comment
Попробовал это и не сработало, а также попытался использовать endlocal на следующей строке. Мой вопрос был на самом деле неправильным, поскольку у меня был endlocal в конце сценария, а не раньше. - person Brian Folan; 30.08.2016