0

在尝试将第三个 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 当前放置在程序的开头和结尾。

我希望这种情况对社区有足够的兴趣,因为迫切需要您的帮助并且非常感谢。

4

1 回答 1

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)您可以消除第 2 个 SET /A 并在第 3 个循环中减去 2。

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

3)最后不需要清除每个变量。只需在开头的 SETLOCAL 和结尾的 ENDLOCAL。


关于何时启用延迟扩展:很可能您可以在开始时简单地启用延迟扩展。但是,如果您的任何标题值包含,这将导致问题,因为如果启用延迟扩展,则!该值将在扩展时损坏。%%b

如果标题可能包含!,那么您必须在第二个循环中打开和关闭延迟扩展。但是你必须保留LENDLOCAL 之后的值。您可以执行以下操作:

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
于 2013-01-21T03:38:52.270 回答