【问题标题】:Batch GOTO label with duplicate labels带有重复标签的批量 GOTO 标签
【发布时间】:2015-10-10 06:31:52
【问题描述】:

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

【问题讨论】:

    标签: batch-file label goto


    【解决方案1】:

    我相信原因是该名称的 last 标签是解释器记住的标签。解释器将标签和位置存储在内存中的表中。如果遇到另一个同名标签,这只会覆盖之前的同名标签。

    干杯

    【讨论】:

      【解决方案2】:

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

      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%
      
      )
      

      输出:

      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
      

      【讨论】:

        猜你喜欢
        • 2011-10-02
        • 1970-01-01
        • 2012-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多