批处理:FOR /R 不适用于路径中的变量

GG.*_*GG. 4 variables loops batch-file

一个例子:

FOR %%i IN (3) DO (
    ECHO %%i
    FOR /R "C:\backup\server%%i\temp" %%? IN (*.bak) DO (
        REM some code...
    )
)
Run Code Online (Sandbox Code Playgroud)

的结果ECHO3

第二个结果FOR代码没有被执行

但与:

FOR %%i IN (3) DO (
    ECHO %%i
    FOR /R "C:\backup\server3\temp" %%? IN (*.bak) DO (
        REM some code...
    )
)
Run Code Online (Sandbox Code Playgroud)

的结果ECHO3

第二个结果FOR代码被执行

任何想法?

dbe*_*ham 5

原始代码不起作用的原因是因为在解析 FOR 时必须知道 FOR /R 选项的目录,但 %%i 变量只有在解析了 FOR 语句之后才会展开。adarshr 建议也存在同样的问题 - !suffix! 在解析 FOR 语句之后才会展开。

GG的回答是一个非常好的可行的解决方法。也许可以通过 PUSHD 和最后的 POPD(而不是 CD)来改进。但仅限于需要时。

我能想到解决这个问题的唯一其他方法是这样的

@echo off
FOR %%i IN (3) DO call :innerLoop %%i
exit /b

:innerLoop
FOR /R "C:\backup\server%1\temp" %%? IN (*.bak) DO (
  REM some code...
)
exit /b
Run Code Online (Sandbox Code Playgroud)

但除非迫不得已,我不喜欢使用 CALL,因为它效率低下。我喜欢 CD 解决方案。