加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

批处理文件 – Windows CMD批处理:具有DelayedExpansion的FOR /

发布时间:2020-12-14 04:25:22 所属栏目:Windows 来源:网络整理
导读:在我的桌面上,有一个名为“test”的文件夹.在这个文件夹里面有两个文件,“file1.txt”和“file2.txt”. 看看这个简单的批处理脚本: @ECHO OFFSET test="C:UsersTylerDesktoptest"ECHO %test%FOR /R %test% %%F IN (*) DO ( ECHO %%F) 正如您所料,它输出
在我的桌面上,有一个名为“test”的文件夹.在这个文件夹里面有两个文件,“file1.txt”和“file2.txt”.

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

@ECHO OFF

SET test="C:UsersTylerDesktoptest"

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

正如您所料,它输出以下内容:

"C:UsersTylerDesktoptest"
C:UsersTylerDesktoptestfile1.txt
C:UsersTylerDesktoptestfile2.txt

现在来看看这个变化:

@ECHO OFF

SETLOCAL ENABLEDELAYEDEXPANSION

SET test="C:UsersTylerDesktoptest"

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

ENDLOCAL

我希望它的输出没有什么不同.但是,这里是:

"C:UsersTylerDesktoptest"

好像!测试!在ECHO!测试中得到扩展!线,但不在FOR / R!测试中!线,变得公正!测试!因为那当然不是有效路径,FOR / R循环永远不会迭代.

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

解决方法

为什么FOR工作与ECHO不同是因为批处理解析器(cmd.exe)具有FOR,IF和REM的特殊 parsing rules.

因此,延迟扩展对于此处的参数不起作用,仅适用于括号内的参数.

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

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

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET test="C:UsersTylerDesktoptest"

ECHO !test!
call :doMyLoop test
exit /b

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读