TSm*_*ith 4 command-line for-loop cmd batch-file variable-expansion
在我的桌面上,有一个名为"test"的文件夹.在这个文件夹里面有两个文件,"file1.txt"和"file2.txt".
看看这个简单的批处理脚本:
@ECHO OFF
SET test="C:\Users\Tyler\Desktop\test"
ECHO %test%
FOR /R %test% %%F IN (*) DO (
ECHO %%F
)
Run Code Online (Sandbox Code Playgroud)
正如您所料,它输出以下内容:
"C:\Users\Tyler\Desktop\test"
C:\Users\Tyler\Desktop\test\file1.txt
C:\Users\Tyler\Desktop\test\file2.txt
Run Code Online (Sandbox Code Playgroud)
现在来看看这个变化:
@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET test="C:\Users\Tyler\Desktop\test"
ECHO !test!
FOR /R !test! %%F IN (*) DO (
ECHO %%F
)
ENDLOCAL
Run Code Online (Sandbox Code Playgroud)
我希望它的输出没有什么不同.但是,这里是:
"C:\Users\Tyler\Desktop\test"
Run Code Online (Sandbox Code Playgroud)
它似乎在线上!test!
扩展ECHO !test!
,但不FOR /R !test!
在线,变得公正!test!
.因为那当然不是有效路径,FOR/R循环永远不会迭代.
为什么是这样?我错过了什么?
为什么作品比ECHO不同的是,因为批量解析器(CMD.EXE)具有特殊的解析规则为FOR
,IF
和REM
.
因此,延迟扩展对于此处的参数不起作用,仅适用于括号内的参数.
只有百分比扩展适用于参数,因为解析器在切换到特殊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
)
Run Code Online (Sandbox Code Playgroud)