首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用算术变量替换for循环中的字符串

使用算术变量替换for循环中的字符串
EN

Stack Overflow用户
提问于 2015-02-25 07:38:31
回答 2查看 43关注 0票数 0

试图生成一个文件名的循环列表,从一个基本文件开始,然后循环遍历无限数量的“子”文件。例如,程序应产生:

代码语言:javascript
复制
Layout.txt
SubLayout{1}.txt
SubLayout{2}.txt
SubLayout{3}.txt
Layout.txt
SubLayout{1}.txt
etc. 

存在同名文件的地方。SubLayout{3}.txt不存在,因此循环到原始文件。我的字符串替换和算术vars的语法出了问题,很难让它工作起来。守则:

代码语言:javascript
复制
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

我认为冒犯的底线是:

代码语言:javascript
复制
 set _tempprocRig=%_procRig:{_tempsubcount}={_subsubcount}%

原来的代码没有gotos,只是在这里作了修改,以作说明。会很感激你的帮助。

更新:背景见Magoos帖子中的评论。代码更新(仍未解决):

代码语言:javascript
复制
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 
EN

回答 2

Stack Overflow用户

发布于 2015-02-25 08:02:33

既然你已经发布了“修正”代码,那就有点难说了。你的目标还不清楚。

这条线可以改为这样,以满足你的期望:

代码语言:javascript
复制
CALL set _tempprocRig=%%_procRig:{!_tempsubcount!}={!_subsubcount!}%%

但你得取消setlocal enabledelayedexpansion的手术

票数 1
EN

Stack Overflow用户

发布于 2015-02-25 20:30:20

好的。在这件事上采取了不同的策略让它发挥作用。只工作到99,但很容易修改100,1000等。

代码语言:javascript
复制
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 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28713625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档