4

Я попытался применить ответ, данный Spaceballs, к этому вопросу в теле for -loop.

example.bat:

@echo off

copy NUL %1
echo firstLine >> %1

echo /=======================/
for /l %%x in (1,1,3) do (
  echo %%x
  set /p A=< %1
  echo %A%
)
echo /=======================/

set /p A=< %1
echo %A%

Результат start example.bat temp.txt:

     1 file(s) copied.

/=======================/

1

ЭХО ВЫКЛ.

2

ЭХО ВЫКЛ.

3

ЭХО ВЫКЛ.

/=======================/

первая строка

Почему set /p A=< %1 не работает в теле for -loop?

1 ответ1

3

Основная проблема заключается в том, что, помимо переменной цикла, cmd расширяет переменные в цикле пакетного файла перед выполнением цикла, поэтому, хотя в цикле устанавливается A , значение, которое отображается перед входом в цикл (т.е. пустой). Вы можете видеть, что значение было установлено, опуская set перед окончательным echo: результат будет таким же.

Ответ - включить отложенное расширение и использовать !A! вместо %A% .

Кстати, команды copy и echo в начале файла - это слишком долгий способ записи echo firstLine > %1 .

Таким образом, ваш пакетный файл будет работать как положено, если вы измените его следующим образом:-

@echo off

SetLocal EnableDelayedExpansion

rem copy NUL %1
rem echo firstLine >> %1
echo firstLine > %1

echo /=======================/
for /l %%x in (1,1,3) do (
  echo %%x
  set /p A=< %1
  echo !A!
)
echo /=======================/

rem set /p A=< %1
echo %A%

Обратите внимание, что вы будете устанавливать A в одно и то же значение на каждом проходе цикла. Вам нужно будет использовать другую технику, если вы хотите, чтобы каждый проход отображал последовательные строки из файла.

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