Windows批处理脚本:ENABLEDELAYEDEXPANSION + For Loop无法按预期工作

Mak*_*i84 0 windows batch-file

我不知道如何使以下代码工作.循环不返回所有假定的文件,%%~FI只在FOR循环开始时展开.到最后一个命令执行时,"%%~FI"产生一个文字字符串而不是扩展到所需的文件名:

SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%I IN (*.foo *.bar) DO (
    SET OFileBase=%%~DPNI
    ECHO "%%~FI" REM Expands correctly at this point
    :WhileLoop2
    IF EXIST "!OFileBase!.baz" (
        SET /A SuffixIndex += 1
        SET OFileBase=%%~DPNI [!SuffixIndex!]
        GOTO WhileLoop2
    )
    ECHO "%%~FI" REM Expands no more, now a literal string?!
    fooparser.exe --input "%%~FI" - | bazmaker.exe - "!OFileBase!.baz"
)
ENDLOCAL
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Mag*_*goo 5

SETLOCAL ENABLEDELAYEDEXPANSION
FOR %%I IN (*.foo *.bar) DO (
    SET OFileBase=%%~DPNI
    ECHO "%%~FI" REM Expands correctly at this point
    call :WhileLoop2 "%%~DPNI"
    ECHO "%%~FI" REM Expands no more, now a literal string?!
    fooparser.exe --input "%%~FI" - | bazmaker.exe - "!OFileBase!.baz"
)
ENDLOCAL
goto :eof

:WhileLoop2
IF EXIST "!OFileBase!.baz" (
 SET /A SuffixIndex += 1
 SET OFileBase=%~1 [!SuffixIndex!]
 GOTO WhileLoop2
)
goto :eof
Run Code Online (Sandbox Code Playgroud)

总是难以与批次中的一个孤立部分一起工作 - 尤其是那些显然已被进一步限制的部分.

您的问题是尝试在块语句中使用标签(带括号的系列语句).不是一个好主意 - 混淆FOR并终止循环.

由于您%%I在内部循环中使用元变量,因此将其作为带引号的参数(如果%%I包含分隔符)传递给子例程,然后访问子例程%~1中删除引号的值.