试图生成一个文件名的循环列表,从一个基本文件开始,然后循环遍历无限数量的“子”文件。例如,程序应产生:
Layout.txt
SubLayout{1}.txt
SubLayout{2}.txt
SubLayout{3}.txt
Layout.txt
SubLayout{1}.txt
etc. 存在同名文件的地方。SubLayout{3}.txt不存在,因此循环到原始文件。我的字符串替换和算术vars的语法出了问题,很难让它工作起来。守则:
echo off
set _procRig=Layout.txt
set _sysSub=SubLayout{1}.txt
set _origRig=%_procrig%
:MainProceedureLoop
if "%_procRig%" == "%_origRig%" (
echo Rig = Original Rig
set _procRig=%_sysSub%
set /a _subsubcount=1
) else (
echo Rig is not the original
set /a "_tempsubcount=_subsubcount"
set /a "_subsubcount+=1"
set _tempprocRig=%_procRig:{_tempsubcount}={_subsubcount}%
echo Rig with replacement: [!_tempprocRig!]
if exist "C:\tests\!_tempprocRig!" (
echo Rig exists
set _procRig=!_tempprocRig!
) else (
echo Rig doesn't exist
set _procRig=%_origRig%
)
)
echo Out: [%_procRig%]
pause
goto :MainProceedureLoop我认为冒犯的底线是:
set _tempprocRig=%_procRig:{_tempsubcount}={_subsubcount}%原来的代码没有gotos,只是在这里作了修改,以作说明。会很感激你的帮助。
更新:背景见Magoos帖子中的评论。代码更新(仍未解决):
echo off
setlocal enabledelayedexpansion
::Set
set _procRig=Layout.txt
set _sysSub=SubLayout{1}.txt
set _origRig=%_procrig%
:: Stuff....
:: (_procRig can potentially change during "Stuff" - hence _origRig)
:Loop_For_Example_only
::Dummy conditional:
pause
call :Cycle_filenames
echo Return Vars:
echo _procRig: [%_procRig%]
echo _subsubcount: [%_subsubcount%]
goto :Loop_For_Example_only
exit /b
:Cycle_filenames
setlocal disabledelayedexpansion
echo --------------------------------
echo Vars In:
echo _procRig: [%_procRig%]
echo _origRig: [%_origRig%]
echo _subsubcount: [%_subsubcount%]
if "%_procRig%" == "%_origRig%" (
echo Rig = Original Rig
echo Syssub: [%_sysSub%]
set _procRig=%_sysSub%
set /a _subsubcount=1
) else (
echo Rig is not the original
echo sub: %_subsubcount%
pause
set /a "_tempsubcount=%_subsubcount%"
set /a "_subsubcount+=1"
call set _tempprocRig=%%_procRig:{!_tempsubcount!}={!_subsubcount!}%%
echo Rig with replacement: [%_tempprocRig%]
if exist "C:\tests\%_tempprocRig%" (
echo Rig exists
set _procRig=%_tempprocRig%
) else (
echo Rig doesn't exist
set _procRig=%_origRig%
)
)
echo Out: [%_procRig%]
endlocal && set _procRig=%_procRig%&& set _subsubcount=%_subsubcount%
goto :eof 发布于 2015-02-25 08:02:33
既然你已经发布了“修正”代码,那就有点难说了。你的目标还不清楚。
这条线可以改为这样,以满足你的期望:
CALL set _tempprocRig=%%_procRig:{!_tempsubcount!}={!_subsubcount!}%%但你得取消setlocal enabledelayedexpansion的手术
发布于 2015-02-25 20:30:20
好的。在这件事上采取了不同的策略让它发挥作用。只工作到99,但很容易修改100,1000等。
echo off
setlocal enabledelayedexpansion
::Set
set _procRig=Layout
set _sysSub=SubLayout{1}
set _origRig=%_procrig%
:Loop_For_Example_only
::Dummy conditional:
pause
call :Cycle_filenames
echo Return Vars:
echo _procRig: [%_procRig%]
echo _subsubcount: [%_subsubcount%]
goto :Loop_For_Example_only
exit /b
:Cycle_filenames
echo --------------------------------
echo Vars In:
echo _procRig: [%_procRig%]
echo _origRig: [%_origRig%]
echo _subsubcount: [%_subsubcount%]
if "%_procRig%" == "%_origRig%" (
echo Rig = Original Rig
echo Syssub: [%_sysSub%]
set "_procRig=%_sysSub%"
set /a "_subsubcount=1"
) else (
echo Rig is not the original
echo sub: %_subsubcount%
set /a "_tempsubcount=%_subsubcount%"
set /a "_subsubcount+=1"
if _subsubcount GEQ 9 (
set _tempprocRig=!_procRig:~0,-3!
set _tempprocRig=!_tempprocRig!!_subsubcount!}
) else (
set _tempprocRig=!_procRig:~0,-2!
set _tempprocRig=!_tempprocRig!!_subsubcount!}
)
echo Rig with replacement: [!_tempprocRig!]
if exist "C:\tests\!_tempprocRig!.txt" (
echo Rig exists
set _procRig=!_tempprocRig!
) else (
echo Rig doesn't exist
set _procRig=!_origRig!
)
)
echo Out: [%_procRig%]
goto :eof https://stackoverflow.com/questions/28713625
复制相似问题