Batch for循环可以增加步长值吗?

时间:2013-03-19 16:48:47

标签: batch-file batch-processing

这可能是短暂而甜蜜的,但我只是在检查。

批处理for命令是否可以增加步长值?

@echo off
SetLocal EnableDelayedExpansion
set xyz=200
for /l %%n in (100,%xyz%,26000) do (
    set /a value_=!value_!+1
    set x=%%n
    set value_!value_!=!x!
    echo value_!value_!=!x!
)
echo.
echo variable 'value_5' = !value_5!
echo.
pause

运行上面的代码几乎完全符合我的需要(按顺序为每个更高的变量生成更高的值)。唯一的区别是我需要步长值增加每个循环的两倍。 +200第一循环,+ 400秒循环,+ 800第三循环等。

目前,每个循环有200个输出:

value_1=100
value_2=300
value_3=500
value_4=700
value_5=900
value_6=1100
value_7=1300
...

...
variable 'value_5' = 900

每次增加200(xyz)。我真的需要每次在前一个值上加倍步长增量。在for语句内部或外部添加计算不会更改输出。

所以输出会显示为:

value_1=100
value_2=300
value_3=700
value_4=1500
value_5=3100
value_6=6300
value_7=12700
value_8=25500

variable 'value_5' = 3100

我希望这是有道理的。如果不可能,还有另一种快速的做法,或者我会有很多

set value_1=100
set value_2=300
...

...
set value_98=xxx
set value_99=xxx

线占用了大量空间。那我和我必须计算每一行。

3 个答案:

答案 0 :(得分:2)

@echo off
SetLocal EnableDelayedExpansion
set xyz=200
SET minval=100
SET maxval=26000
SET /a numvals=2+((maxval-minval) / xyz)
SET num
for /l %%n in (1,1,%numvals%) do (
    IF !minval! LEQ %MAXVAL% (
     set /a value_%%n=!minval!
     SET /a minval+=xyz
     SET /a xyz=2*!xyz!
     )
)
echo.
echo variable 'value_5' = !value_5!
echo.
SET value_
pause

答案 1 :(得分:1)

您确定批次是最好的语言吗?以下是您在JScript中寻找的内容:

// test.js
var val=[];
for (var x=y=100; x<=26000; y*=2, x+=y) {
    val.push(x);
    n = val.length - 1;
    WSH.echo("val[" + n + "]=" + x);
}
WSH.echo("\nvariable 'val[4]' = " + val[4] + '\n');

输出:

C:\Users\me\Desktop>cscript /nologo test.js
val[0]=100
val[1]=300
val[2]=700
val[3]=1500
val[4]=3100
val[5]=6300
val[6]=12700
val[7]=25500

variable 'val[4]' = 3100

请记住JavaScript数组是0索引的,其中element[0]是第一个元素,element[1]是第二个元素,等等。

答案 2 :(得分:0)

您也可以使用%While%循环以这种方式解决此问题:

@echo off
setlocal EnableDelayedExpansion
rem Define auxiliary While variables
set While=if "%1" equ "While" ( for /L %%? in () do if
set Do=(
set EndWhile=) else exit ) else for /F %%a in ('cmd /Q /C "%~F0" While') do set %%a
rem While dispatcher
if "%1" equ "While" goto WhileBody
rem Original program
set xyz=200
set n=100
:WhileBody
%While% !n! leq 26000 %do%
    set /A value_+=1
    set value_!value_!=!n!
    echo value_!value_!=!n!
    set /A n+=xyz, xyz*=2
%EndWhile%
set value_
echo.
echo variable 'value_5' = !value_5!
echo.
pause

前一个程序的前8行详细描述于this site。此方法可以更通用的方式使用,更清晰(即“原始程序”行)。

安东尼奥