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)
有趣的问题!答案由两部分组成:
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)