带有重复标签的批量GOTO标签

时间:2015-07-21 00:04:17

标签: 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 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

2 个答案:

答案 0 :(得分:1)

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

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

第二次编辑:以下示例证明标签是按照上述第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

答案 1 :(得分:0)

我认为原因是该名称的 last 标签是解释器记住的标签。解释器将标签和位置存储在内存中的表中。如果它遇到另一个具有相同名称的标签,则只会用相同的名称覆盖以前的标签。

干杯