批量 GOTO 标签重复标签

sma*_*lie 3 label goto batch-file

不幸的是,我拥有一个具有重复标签名称的批处理程序。谁能解释为什么 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
)
Run Code Online (Sandbox Code Playgroud)

输出:

IN THE FIRST IF...
HERE AT TD_NEXT IN THE SECOND BLOCK
Run Code Online (Sandbox Code Playgroud)

我可以添加第三个块,并看到它每次都会跳到下一个块。

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
Run Code Online (Sandbox Code Playgroud)

Aac*_*ini 5

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

1 -命令始终寻找从下一条指令到文件末尾的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%

)
Run Code Online (Sandbox Code Playgroud)

输出:

This appear first time:  var=1
This appear second time: var=2
Run Code Online (Sandbox Code Playgroud)

第二次编辑:下面的示例证明标签是按照上面第 1 点描述的方式查找的:

@echo off

goto PATCH

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

:PATCH
echo In an infinite loop:
goto LABEL
Run Code Online (Sandbox Code Playgroud)

输出:

In an infinite loop:
In an infinite loop:
At end of file
Run Code Online (Sandbox Code Playgroud)