Windows CMD批处理:FOR/R with DelayedExpansion

问题描述:

在我的桌面上,有一个名为“test”的文件夹。此文件夹内有两个文件,“file1.txt”“file2.txt”Windows CMD批处理:FOR/R with DelayedExpansion

看看这个简单的批处理脚本:

@ECHO OFF 

SET test="C:\Users\Tyler\Desktop\test" 

ECHO %test% 
FOR /R %test% %%F IN (*) DO (
    ECHO %%F 
) 

正如你所期望的,它输出以下:

"C:\Users\Tyler\Desktop\test" 
C:\Users\Tyler\Desktop\test\file1.txt 
C:\Users\Tyler\Desktop\test\file2.txt 

现在来看看这种变化:

@ECHO OFF 

SETLOCAL ENABLEDELAYEDEXPANSION 

SET test="C:\Users\Tyler\Desktop\test" 

ECHO !test! 
FOR /R !test! %%F IN (*) DO (
    ECHO %%F 
) 

ENDLOCAL 

我希望它的输出没有什么不同。然而,在这里,它是:

"C:\Users\Tyler\Desktop\test" 

看来,!test!ECHO !test!线得到扩充,但不是在FOR /R !test!线,成为刚刚!test!。因为那当然不是有效的路径,所以FOR/R循环不会迭代。

这是为什么?我错过了什么?

为什么FOR作品不同于ECHO是因为批解析器(cmd.exe)对于FOR,IFREM有特殊的parsing rules

因此延迟扩展不适用于这里的参数,只适用于圆括号内的参数。

只有百分比扩展适用于参数,因为解析器在切换到特殊的FOR解析器规则之前执行百分比扩展阶段。

如果你不能使用百分比展开,因为你在块内部,你可以将代码移动到一个自己的函数中并调用它。

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET test="C:\Users\Tyler\Desktop\test" 

ECHO !test! 
call :doMyLoop test 
exit /b 

:doMyLoop 
set "arg=!%1!" 
FOR /R %arg% %%F IN (*) DO (
    ECHO %%F 
) 
+0

这很有趣(和不幸)。谢谢! – TSmith