我遗憾地拥有一个具有重复标签名称的批处理程序。任何人都可以解释为什么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
命令的末尾搜索 ...
这只是不在代码块中放置标签的另一个原因;这也会导致其他几个问题。
编辑:看到这个有趣的例子:
@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 标签是解释器记住的标签。解释器将标签和位置存储在内存中的表中。如果它遇到另一个具有相同名称的标签,则只会用相同的名称覆盖以前的标签。
干杯