::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
答案 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.
。这使程序有时间重置它使用的数据,这要归功于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语句之外,没有什么区别。
虽然遗憾的是我还没有正确的代码形式,但我知道我给出的代码示例可以用来实现您的特定愿望。