Windows批处理:在循环中使用goto

时间:2015-06-28 11:18:50

标签: batch-file

以下代码运行一个连续循环,该变量递增变量counter。当计数器达到10时,它应调用set_varibles例程,然后从调用的地方set_variables继续循环。但是,goto不起作用。有什么问题,还有更好的解决方案吗?感谢

@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

:set_variables
SET t=ooo

:my_loop
set /a counter=0
for /L %%n in (1,0,10) do (
   echo !counter!
   set /a counter=counter+1
   if !counter! equ 10 (
      echo now TEN
      goto set_variables
   )
)
@echo on
ENDLOCAL

5 个答案:

答案 0 :(得分:2)

CALL a subroutine (:label)

  

以下代码运行一个连续循环,它会递增   变量counter。当counter到达10时,它应该调用   set_varibles例程,然后从该地方继续循环   set_variables被召唤。

正如提议的那样:echo now TENcall :set_variables 每隔十次 无尽的循环。

@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

call :set_variables

:my_loop
set /a counter=0
for /L %%n in (1,0,10) do (
   echo !counter!
   set /a counter=counter+1
   set /a auxcounter=counter%%10
   if !auxcounter! equ 0 (
      echo now TEN
      call :set_variables
   )
)
@echo on
ENDLOCAL
@goto :eof

:set_variables
SET t=ooo
@goto :eof

答案 1 :(得分:1)

您的主要问题不是goto命令,而是for /l

虽然通常goto命令会取消任何代码块(括号中的代码),但for /l循环是不同的野兽。只有两种方法可以保留正在运行的for /lexit命令(不是exit /b,除非代码在命令行上下文中运行),或者计数器大于结束时值。

表示goto无法退出循环。它将取消do子句中代码的执行,但是在达到最终值之前循环将不会完成,并且for循环

               start  step   end 
for /L %%n in (    1,    0,   10 ) do  ...

的步长值为0,无法达到最终值。

相当于您发布的代码可能是

@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

:set_variables
    SET t=ooo

:my_loop
    for /L %%n in (0,1,9) do (
       echo %%n
       set /a counter=%%n+1
       rem ....
    )
    echo now TEN
    goto set_variables

答案 2 :(得分:0)

这不是你想要的:

@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

:set_variables

:my_loop
for /L %%n in (1,1,10) do (
   echo %%n
   if %%n equ 10 (
      echo now TEN
      SET t=ooo
   )
)
goto my_loop

@echo on
ENDLOCAL

答案 3 :(得分:0)

在括号内使用GOTO - 包括FOR和IF命令 - 将破坏它们的上下文。

你的剧本中有些东西看起来很奇怪。为什么有一个连续循环然后在计数器达到10时重新启动它?为什么不在(1,1,10)"中使用"比如在Monacraft的回答中?

为什么这个经过调整的版本不能满足您的需求?

@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

set /a outer_counter=0

:set_variables
echo start of set_variables
SET t=ooo

:my_loop
set /a counter=0
for /L %%n in (1,1,10) do (
   echo !counter!
   set /a counter=counter+1
   set /a outer_counter=outer_counter+1
   if !counter! equ 10 (
     echo now TEN
   )
)

if !outer_counter! geq 100 goto after_loop
goto set_variables


:after_loop
echo FINISHED
@echo on
ENDLOCAL
pause

答案 4 :(得分:0)

我讨厌在评论而不是问题描述中添加其他规范,但此评论出现在Monacraft的答案下面:

  

我想重新运行循环中定期调用的例程。   每次计数器达到某个值时,都必须调用例程   和计数器变量重置。

所以我认为所有 OP请求的解决方案是这样的:

@echo off
SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION

call :set_variables

:my_loop
for /L %%n in (1,0,10) do (
   echo !counter!
   set /a counter=counter+1
   if !counter! equ 10 (
      echo now TEN
      call :set_variables
   )
)

No matter what is placed here, because a *continuous loop* NEVER ENDS!
@echo on
ENDLOCAL


:set_variables
SET t=ooo
set /a counter=0
exit /B