试图整合第三个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目前位于开始和放置位置。结束 该计划。
我希望这种情况对社会有足够的兴趣 迫切需要你的帮助&非常感激。
答案 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