在这两种情况下,该目录包含三个名为test1.txt,test2.txt,test3.txt的文件
有人可以解释为什么会有效:
echo off
set CP=
for %%f in (*.txt) do (
call :concat %%f
)
echo %CP%
:concat
set CP=%CP%;%1
输出:
C:\test>test
C:\test>echo off
;test1.txt;test2.txt;test3.txt
C:\test>
但这不是:
echo off
set CP=
for %%f in (*.txt) do (
set CP=set CP=%CP%;%%f
)
echo %CP%
输出:
C:\test>test
C:\test>echo off
;test3.txt
C:\test>
答案 0 :(得分:3)
它与延迟扩展有关。
例如,这将像您的第一个示例一样工作:
echo off
SETLOCAL EnableDelayedExpansion
set CP=
for %%f in (*.txt) do (
set CP=!CP!;%%f
)
echo %CP%
ENDLOCAL
当启用延迟扩展时,在每次迭代上评估用!
包围的变量,而不是仅在解析循环时第一次(这是{{1包围的变量的方式)解析)。
您的第一个示例有效,因为处理是在%
语句中完成的,该语句将控制权传递给批处理文件的另一个段,该段在技术上位于循环之外,因此每次执行时都会对其进行单独解析。