Основная проблема заключается в том, что, помимо переменной цикла, 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 в одно и то же значение на каждом проходе цикла. Вам нужно будет использовать другую технику, если вы хотите, чтобы каждый проход отображал последовательные строки из файла.