在Batch中模拟while循环

时间:2016-12-01 19:57:43

标签: batch-file cmd

我正在尝试在Batch中模拟while循环,这是我的代码:

@echo off
set test=0

:main
call:whileLSS %test% 4 :count

:whileLSS
if %1 LSS %2 (
    echo %1
    call%3
    goto whileLSS
)
goto:EOF

:count
set /a test=%test%+1
goto:EOF

这只输出0,而不是像我想要的那样输出“0 1 2 3”。

问题是循环永远存在,因为%1没有最新的测试值。

这是正确的方法吗?

如何更新%1的值?

有没有办法不用像LSS那样对运营商进行硬编码?

3 个答案:

答案 0 :(得分:3)

正如您所知,您无法更改Arg,您可以将arg作为参考并更改引用的var,这需要延迟扩展。
你的第一个子也没有与流分开。

此批次:

@echo off&Setlocal EnableDelayedExpansion
set test=0

:main
call:whileLSS test 4 :count
Goto :Eof

:whileLSS
if !%1! LSS %2 (
    echo !%1!
    call%3
    goto whileLSS
)
goto:EOF

:count
set /a test+=1
goto:EOF

生成此输出:

0
1
2
3

修改
if的操作符也可以作为arg:

提供
@echo off&Setlocal EnableDelayedExpansion
set test=0

:main
call:while test LSS 4 :Increment
set test=10
call:while test GTR 4 :Decrement

Goto :Eof
:while
if !%1! %2 %3 (
    echo !%1!
    call %4 %1
    goto while
)
goto:EOF

:Increment
set /a %1+=1
goto:EOF

:Decrement
set /a %1-=1
goto:EOF

答案 1 :(得分:0)

喜欢这个可能吗?

@echo off

:main
set /a a=1
set /P i=Enter i:
call:whileLSS %a% %i%

:whileLSS
    echo %1
    if %1 LSS %2  call:reinitialize %1 %2
    goto:EOF


:reinitialize
    set /a c=%1
    set /a b=%c%+1
    set /a d=%2
    call:whileLSS %b% %d%

goto:EOF

答案 2 :(得分:0)

试试这个:

@echo off 
Setlocal EnableDelayedExpansion
set test=0

:main
call :whileLSS !test! 4 
Goto :Eof

:whileLSS
set i=%1
set j=%2

:loop
if !i! LSS !j! (
    echo !i!
    call :count
    goto :loop
)

goto :EOF

:count
set /a i+=1
goto :EOF