例子.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
ECHO 已关闭。
2
ECHO 已关闭。
3
ECHO 已关闭。
/=========================/
第一行
为什么set /p A=< %1
不在循环体中工作for
?
答案1
主要问题是,除了循环变量之外,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
为相同的值。如果您希望每次传递都显示文件中的连续行,则需要使用不同的技术。