2013-01-20 89 views
0

在試圖集成第三個循環&它支持代碼到現有的 代碼&我已經達到了我的理解極限。我完全失去了在這個複雜的「EnableDelayedExpansion」環境中如何引用 各種變量。嵌套三(3)for循環&EnableDelayedExpansion

此外,應該在每個 For循環或僅在開始&程序結束時打開/關閉「EnableDelayedExpansion」/ endlocal。

:: ------------------ Beg For #1 
     For /L %%a in (%XBEG%,1,%XEND%) do (
     cls 
     echo : %%a 
     set L=1 
:: ------------------ Beg For #2 
     For /F "delims=" %%b in (%XDRV%%XPATH%%%a\1dir%%a.txt) do (
     set XTITLE=%%b 
     echo Line !L!: !XTITLE! 
     If not {!XTITLE!}=={!XTITLE:%XDRV%%XPATH%%%a\!} set XTITLE=!XTITLE:~18,-4! 
     :: 
:: ------------------ Beg For #3 --- New code 
:: Write title to the xtemp file. Place the redirection 
:: symbol, i.e., greater than sign, IMMEDIATELY after vari 
:: to avoid a trailing space, i.e., (%vari%>) 
     echo !XTITLE!> %XDRV%%XPATH%xtemp.txt 
:: Get the file size in bytes, each byte = one character 
     For %%c in (%XDRV%%XPATH%xtemp.txt) do set /a XLEN=%%~zc 
:: Subtract 2 bytes, 1 for CR, 1 for LF, from Length 
     set /a XLEN -=2 

     cls 
     echo : ===[ Debug ]====================================== 
     echo - !XTITLE! - has !XLEN! characters. 
     set /a XPAD=50-!XLEN! 
     echo - Xpad is !XPAD! 

:: Build the Index entry 
     set XENTRY=%XPADs%%XTITLE%%XPAD%%%a 
     echo - %XENTRY% 
     pause 

:: remove the xtemp file 
     del %XDRV%%XPATH%xtemp.txt 
     set /a L=!L!+1 
     pause 
:: ------------------ end of New code 
    ):: End For #2 
    ) 
:: End For #1 
::  Clean Up For3 
     set XTITLE= 
     set L= 
    Goto DOS 

的 「EnableDelayedExpansion」/ ENDLOCAL當前放置在節目的開始&端 。

這是我的希望,這種情況是有足夠的興趣社區 您的幫助迫切需要&將非常感激。

回答

2

你從不明確你的問題是什麼。你正在用文件路徑做一些奇怪的事情,但我不知道你在做什麼是有道理的。

我確實看到一些明確的錯誤:

1)If not {!XTITLE!}=={!XTITLE:%XDRV%%XPATH%%%a\!} ... 它看起來像你正試圖查找和替換,以測試變量包含的路徑字符串。但你忘了你的=。此外,在IF測試中,您應該在執行搜索和替換或子字符串操作時使用帶有延遲擴展的引號。

修正:在這個現有的代碼中所需

if not "!XTITLE!"=="!XTITLE:%XDRV%%XPATH%%%a\=!" ... 

2)附加延遲擴展。此外,您還有一個額外的不需要s。我還想使用引號來確保在作業結束時沒有隱藏的空格。

set XENTRY=%XPADs%%XTITLE%%XPAD%%%a 
echo - %XENTRY% 

更正:

set "XENTRY=!XPAD!!XTITLE!!XPAD!%%a" 
echo - !XENTRY! 

在一般情況下,我覺得你的代碼可以分配過程中使用更多的報價。

可能還有其他問題,但這是我在沒有真正測試代碼的情況下看到的,也不知道它應該做什麼。


有一些優化可能

1)無需刪除臨時文件中的每個迭代。您只需要在外部循環外部的末尾刪除它。

2)您可以消除第二個SET/A並在第3個循環內減去2。

For %%c in (%XDRV%%XPATH%xtemp.txt) do set /a XLEN=%%~zc - 2 

3)最後不需要清除每個變量。簡單的SETLOCAL開始,ENDLOCAL結束。


關於何時啓用延遲擴展:很可能您可以在開始時簡單啓用延遲擴展。但是,如果您的任何標題值包含!,則會導致問題,因爲如果啓用延遲擴展,則在擴展%%b時,該值將被損壞。

如果標題可能包含!那麼您必須在第二個循環內開啓和關閉延遲擴展。但是,您必須在ENDLOCAL之後保留L的值。你可以做如下事情:

For /F "delims=" %%b in (%XDRV%%XPATH%%%a\1dir%%a.txt) do (
    set XTITLE=%%b 
    setlocal enableDelayedExpansion 
    :: ... do your work with delayed expansion 
    :: Use a FOR loop to transport the value of L past ENDLOCAL 
    for %%N in (!L!) do (
    endlocal 
    set "L=%%N" 
) 
):: End For #2 
+0

非常感謝你! U R最友善,並有真正的禮物。 – user1995371