【问题标题】:Windows CMD Batch: FOR /R with DelayedExpansionWindows CMD 批处理:FOR /R 与 DelayedExpansion
【发布时间】:2015-05-19 20:06:26
【问题描述】:

在我的桌面上,有一个名为 "test" 的文件夹。这个文件夹里面有两个文件,"file1.txt""file2.txt"

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

@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 循环永远不会迭代。

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

【问题讨论】:

    标签: batch-file for-loop command-line cmd variable-expansion


    【解决方案1】:

    为什么 FOR 与 ECHO 的工作方式不同是因为批处理解析器 (cmd.exe) 对 FORIFREM 有特殊的 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
    )
    

    【讨论】:

    • 这很有趣(也很不幸)。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-27
    • 2010-09-14
    • 2018-07-06
    • 2021-05-30
    • 2013-01-25
    • 1970-01-01
    • 1970-01-01
    • 2018-06-28
    相关资源
    最近更新 更多