Рассмотрим это как содержимое файла .cmd :

@echo off
set test1=hello
echo 0 %test1%
for %%F in ( *.txt ) do (
  set test2=%%F
  echo 1 %test1%
  echo 2 %test2%
  echo 3 %%F
)
pause

Когда я запускаю этот скрипт в Win 7 из папки, содержащей a.txt и b.txt в качестве единственных файлов .txt, я получаю это:

0 hello
1 hello
2
3 a.txt
1 hello
2
3 b.txt
Press any key to continue . . .

Все "успешные" команды эха (начиная с 0, 1 и 3) являются доказательством того, что эхо и переменный синтаксис верны. "Неудачная" команда эха (2) может быть только результатом неудачной команды SET. Как? Зачем? Какой синтаксис команды SET мне нужен, чтобы переменная test2 назначена правильно, а выходные строки, начинающиеся с 2, были идентичны тем, которые начинаются с 3?

1 ответ1

1

Команда SET полностью в порядке. Происходит то, что во всем блоке DO в команде FOR подставляются переменные при первом чтении. В этот момент переменная test2 пуста, так что именно это отражается в выводе.

Чтобы это исправить, вам нужно использовать SETLOCAL EnableDelayedExpansion перед циклом for и изменить echo %test2% на echo !test2! следующее:

@echo off
set test1=hello
echo 0 %test1%
setlocal enabledelayedexpansion
for %%F in ( *.txt ) do (
  set test2=%%F
  echo 1 %test1%
  echo 2 !test2!
  echo 3 %%F
)
endlocal
pause

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .