当我在double中使用goto时会发生什么?

时间:2017-04-05 10:10:05

标签: windows batch-file cmd

为了更好地解释我在问我做了一小段代码。让我们说我有以下内容:

for /l %%i in (1,1,3) do (
    :break
    for /l %%j in (1,1,3) do (
        if "%%i,%%j" equ "2,2" goto :break
        echo(%%i,%%j
    )
)

上述代码的预期输出为:

1,1
1,2
1,3
2,1
3,1
3,2
3,3

但相反,我得到的结果如下:

1,1
1,2
1,3
2,1
%i,1
%i,2
%i,3

这只是一个例子,它发生在我使用的所有类型的双for循环中。那么,任何人都可以告诉我,goto实际上做了哪些事情会影响到for这么多吗?提前谢谢!

1 个答案:

答案 0 :(得分:4)

GOTO打破for(和if)上下文。因此,在第一次执行goto之后,外部循环执行被中断。由于函数内部的FOR仍然可以访问子程序中的外部令牌,因此可以使用以下解决方法:

@echo off

for /l %%i in (1,1,3) do (
    call ::funct
)


exit /b %errorlevel%

:funct

    for /l %%j in (1,1,3) do (
        rem ::
        rem :: notice that %%i is accessible inside the FOR
        rem ::
        if "%%i,%%j" equ "2,2" goto break
        echo(%%i,%%j
    )
    :break

exit /b %errorlevel%