我不确定如何使以下代码正常工作。该循环不会返回所有假定的文件,%%~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
我究竟做错了什么?
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
总是很难处理一批孤立的部分-尤其是显然已被进一步消毒的部分。
您的问题是试图在block语句(带括号的一系列语句)中使用标签。这不是一个好主意-混淆FOR
并终止循环。
由于您正在%%I
内部循环中使用元变量,因此请将其作为带引号的参数(如果%%I
包含分隔符)传递给子例程,然后访问子例程中的值,%~1
从而删除引号。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句