如何在批处理脚本中增加循环变量?

时间:2016-03-16 15:13:01

标签: batch-file scripting

::Compare with available valid arguments
FOR /L %%i IN (1,1,!avArgc!) DO (
    FOR /L %%j IN (1,1,!argc!) DO (
        IF !avArgv[%%i]!==!argv[%%j]! (
            echo Match: !avArgv[%%i]!

            ::Check the next option
            SET /A nextArg=%%j
            SET /A nextArg+=1
            FOR /L %%n IN (!nextArg!,1,!nextArg!) DO ( 
                IF !nextArg! LEQ !argc! ( 
                    echo next arg: !argv[%%n]!
                    call :CheckSubOption
                )
            ) 
        )
    )
)

在我的上面的代码示例中 - 如何使用像%%j这样的循环变量,并在for循环中递增自身,如%%j++?我现有的解决方案(这很麻烦而且我不喜欢它)是创建一个新变量并将其设置为%%j的值,然后递增该变量并开始使用该变量,如下所示:

::Check the next option
SET /A nextArg=%%j
SET /A nextArg+=1

2 个答案:

答案 0 :(得分:1)

这种情况的一般解决方案是不依赖于循环内的块/ if而是使用不受评估级别阻止的子程序。

FOR /L %%i IN (1,1,!avArgc!) DO call :Loop1 %%i
goto :EOF

:Loop1
FOR /L %%j IN (1,1,!argc!) DO call :Loop2 %1 %%j
goto :EOF

:Loop2
IF !avArgv[%1]!==!argv[%2]! (
            echo Match: !avArgv[%1]!

            ::Check the next option
            SET /A nextArg=%2+1
            call :CheckOpt %nextArg%
)
goto :EOF

:CheckOpt
IF %1 LEQ %argc% ( 
    echo next arg: !argv[%1]!
    call :CheckSubOption
)

答案 1 :(得分:1)

观察您的代码和您的意图,似乎您希望在循环结构中跳过数字。你想改变它的方式会破坏稳定性。在大多数脚本语言(如matlab,bash和batch)中,for循环中使用的变量充当循环内的引用框架。 当你告诉代码运行一个特定的for循环时,它将运行该计算,无论它的参数是否发生变化。一个真实世界的例子是教授使用过时的数字来解决问题,直到第二天他才收到新数据。教授不能相应地改变他的答案,因为他还没有新的数据。

这并不意味着这个问题无法解决。事实上,有很多方法可以解决这个问题。第一个更复杂的涉及嵌套的For结构。

@echo off
set /p maxLength=[Hi times?]
set skip=0

FOR /L %%i IN (1,1,%maxLength%) DO (call :subroutine %%i)

echo alright im done.
pause 
GOTO :eof

rem the below code uses a for loop structure that only loops 1 time based on the passed argument from the overall for loop as so to make changes to how its run.

:subroutine
set /a next=%1+%skip%
 FOR /L %%r IN (%next%,1,%next%+1) DO (call :routine %%r)
 GOTO :eof

:routine
if %1==3 (set /a skip=1)
echo %skip%
echo %next%
echo %1
pause
GOTO :eof

运行程序时,如果next变量大于3,变量maxlength将跳过值3.

  • 之所以如此,是因为嵌套的for循环只运行一次 整个for循环的每次迭代

。这使程序有时间重置它使用的数据,这要归功于call命令,该命令用作更新变量的方法。然而,这是非常低效的,可以用更少的代码行完成。

第二个例子使用GOTO和if语句。

@echo off
set jump=1
:heyman
set /A "x+=%jump%"
if %x%==4 (set /A "jump=2")
echo %x%
if %x% LSS 10 goto heyman
echo done!

这段代码基本上会回显每次增加x的值,直到它达到10的值。但是当它达到4时,增量增加1,所以每次运行循环时,x值增加2。你想要什么,你希望能够改变%%j增量值的方式,这是%%j无法完成的,是一个for循环在其计算中的位置的陈述。除了如何处理for循环和goto语句之外,没有什么区别。

虽然遗憾的是我还没有正确的代码形式,但我知道我给出的代码示例可以用来实现您的特定愿望。