以下代码运行一个连续循环,该变量递增变量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
答案 0 :(得分:2)
以下代码运行一个连续循环,它会递增 变量
counter
。当counter
到达10
时,它应该调用set_varibles
例程,然后从该地方继续循环set_variables
被召唤。
正如提议的那样:echo now TEN
和call :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 /l
:exit
命令(不是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