为什么递归(/ R)for循环在Windows批处理文件中有奇怪的行为

时间:2017-03-27 11:02:12

标签: windows batch-file for-loop recursion cmd

好像是!DRIVE!应该考虑延迟扩展已启用。为什么不呢?为什么以下代码不适用于第一种情况?

@echo off
setlocal EnableDelayedExpansion
SET "DRIVE=H:\"

REM DOESN'T WORK
FOR /R "!DRIVE!" %%S in (*) do (
    echo(%%S
)
pause

REM WORKS
FOR /R "%DRIVE%" %%S in (*) do (
    echo(%%S
)
pause

REM WORKS
FOR /R "H:\" %%S in (*) do (
    echo(%%S
)
pause

1 个答案:

答案 0 :(得分:1)

因为...... that's how it worksfor /f选项也存在此问题)。 For有一个单独的解析器,并且定义不受延迟扩展的影响(尝试没有echo off来查看执行的内容)。您可以使用两种解决方法之一(使用子例程)

@echo off
setlocal EnableDelayedExpansion
SET "DRIVE="H:\""
call :rec !DRIVE!
exit /b 0


:rec
FOR /R "%~1" %%S in (*) do (
    echo(%%S
)

(嵌套)

@echo off
setlocal EnableDelayedExpansion
SET "DRIVE=H:\"

set "cmd=for /R "%%DRIVE%%" %%a in (*) do @echo(%%a"

for /F "delims=" %%x in ('!cmd!') do echo %%x