2013-01-20 32 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