簡體   English   中英

Windows批處理腳本:ENABLEDELAYEDEXPANSION + For循環無法按預期工作

[英]Windows batch script: ENABLEDELAYEDEXPANSION + For Loop not working as expected

我不確定如何使以下代碼正常工作。 該循環不會返回所有假定的文件,並且%%~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訪問子例程中的值,從而刪除引號。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM