Windows 7批处理文件for循环

时间:2015-01-12 14:34:59

标签: windows batch-file

在这两种情况下,该目录包含三个名为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>

1 个答案:

答案 0 :(得分:3)

它与延迟扩展有关。

例如,这将像您的第一个示例一样工作:

echo off
SETLOCAL EnableDelayedExpansion
set CP=
for %%f in (*.txt) do (
    set CP=!CP!;%%f
)
echo %CP%
ENDLOCAL

当启用延迟扩展时,在每次迭代上评估用!包围的变量,而不是仅在解析循环时第一次(这是{{1包围的变量的方式)解析)。

您的第一个示例有效,因为处理是在%语句中完成的,该语句将控制权传递给批处理文件的另一个段,该段在技术上位于循环之外,因此每次执行时都会对其进行单独解析。