2015-07-21 80 views
1

不幸的是,我拥有一个具有重复标签名称的批量程序。任何人都可以解释为什么GOTO会进入第二个区块的标签,而不是第一个? 代码:具有重复标签的批量GOTO标签

@ECHO OFF 
SET FLAG=1 
IF [%FLAG%]==[1] (
    ECHO IN THE FIRST IF... 
    GOTO TD_NEXT 
:TD_NEXT 
    ECHO HERE AT TD_NEXT IN THE FIRST BLOCK 
) 

IF [%FLAG%]==[1] (
    ECHO IN THE SECOND IF... 
    GOTO TD_NEXT 
:TD_NEXT 
    ECHO HERE AT TD_NEXT IN THE SECOND BLOCK 
) 

输出:

IN THE FIRST IF... 
HERE AT TD_NEXT IN THE SECOND BLOCK 

我可以添加第三个块,并且看到它跳转到一个下一个,每次之后。

IN THE FIRST IF... 
HERE AT TD_NEXT IN THE SECOND BLOCK 
IN THE THIRD IF... 
HERE AT TD_NEXT IN THE FIRST BLOCK 
IN THE SECOND IF... 
HERE AT TD_NEXT IN THE THIRD BLOCK 

回答

0

我相信原因是最后标签这个名字是解释记得一个。解释器将标签和位置存储在内存中的表格中。如果遇到另一个具有相同名称的标签,则这会简单地覆盖以前具有相同名称的标签。

干杯

1

有趣的问题!答案由两部分组成:

1- A goto命令始终寻找下一条指令到文件尾部的标签。如果未找到标签,则将从文件的开始处重新开始查找,直到原始goto命令的同一行。如果未找到,则会发出错误。

2-在前面的描述中,的下一条指令通常是指跟在goto后面的行。但是,如果goto被置于的代码块之内(应该永远不要这样做,但那是另一回事),那么“当前指令”是放置goto的整个代码块。这意味着标签可从if命令在年底寻求...

这仅仅是另一个原因,里面的代码块地点标签;这也会导致其他一些问题。

EDIT:请参阅本有趣的例子:

@echo off 

set var=1 
if %var% equ 1 (

:NEXT 
    if %var% neq 1 goto NEXT 
    echo This appear first time: var=%var% 
    set var=2 
    goto NEXT 

:NEXT 
    echo This appear second time: var=%var% 

) 

输出:

This appear first time: var=1 
This appear second time: var=2 

SECOND EDIT:下面的例子证明了标签寻求在点1中描述的方式以上:

@echo off 

goto PATCH 

:LABEL 
echo :LABEL >> "%~F0" 
echo echo At end of file >> "%~F0" 

:PATCH 
echo In an infinite loop: 
goto LABEL 

输出:

In an infinite loop: 
In an infinite loop: 
At end of file