嵌套三(3)个循环& EnableDelayedExpansion

时间:2013-01-20 21:20:21

标签: windows batch-file dos

试图整合第三个for循环&它支持现有的代码 代码和我达到了理解的极限。我完全迷失了如何参考 这个复杂的“EnableDelayedExpansion”环境中的各种变量。

此外,应在每个开启/关闭“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目前位于开始和放置位置。结束 该计划。

我希望这种情况对社会有足够的兴趣 迫切需要你的帮助&非常感激。

1 个答案:

答案 0 :(得分: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并在第三个循环中减去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