为什么批处理脚本中用于读取文本文件第一行的“set /p”方法在“for”循环主体中不起作用?

为什么批处理脚本中用于读取文本文件第一行的“set /p”方法在“for”循环主体中不起作用?

我尝试应用给出的答案太空球这个问题for-环形

例子.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来看到已设置该值:输出将是相同的。setecho

答案是延迟扩张并使用!A!代替%A%

顺便说一下,文件开头的copy和命令的写法没有必要那么长。echoecho 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为相同的值。如果您希望每次传递都显示文件中的连续行,则需要使用不同的技术。

相关内容