我不确定如何使以下代码正常工作。循环不返回所有假定的文件,%%~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
我做错了什么?
答案 0 :(得分: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
总是难以与批次中的一个孤立部分一起工作 - 尤其是那些显然已被进一步限制的部分。
您的问题是尝试在块语句中使用标签(带括号的系列语句)。不是一个好主意 - 混淆FOR
并终止循环。
由于您在内部循环中使用元变量%%I
,将其作为带引号的参数(如果%%I
包含分隔符)传递给子例程,然后将子例程中的值作为{{ 1}}删除引号。