Batch file 带有重复标签的批处理转到标签

Batch file 带有重复标签的批处理转到标签,batch-file,label,goto,Batch File,Label,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指向第二块的标签,而不是第一块吗? 守则:

@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

我相信原因是,这个名字的最后一个标签是口译员记得的。解释器将标签和位置存储在内存中的表中。如果它遇到另一个同名标签,这只会覆盖上一个同名标签


干杯

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

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

2-在前面的描述中,下一条指令通常是指
goto
后面的一行。但是,如果将
goto
放在一个代码块中(这永远不应该做,但这是另一回事),那么“当前指令”就是放置
goto
的整个代码块。这意味着标签是从上的
if
命令的末尾查找的

这只是不在代码块内放置标签的另一个原因;这也会导致其他几个问题

编辑:查看这个有趣的示例:

@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
In an infinite loop:
In an infinite loop:
At end of file
第二次编辑:下面的示例证明标签是按照上文第1点所述的方式查找的:

@echo off

goto PATCH

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

:PATCH
echo In an infinite loop:
goto LABEL
输出:

This appear first time:  var=1
This appear second time: var=2
In an infinite loop:
In an infinite loop:
At end of file