2015-07-21 65 views
1

不幸的是,我擁有一個具有重複標籤名稱的批量程序。任何人都可以解釋爲什麼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 

回答

0

我相信原因是最後標籤這個名字是解釋記得一個。解釋器將標籤和位置存儲在內存中的表格中。如果遇到另一個具有相同名稱的標籤,則這會簡單地覆蓋以前具有相同名稱的標籤。

乾杯

1

有趣的問題!答案由兩部分組成:

1- A goto命令始終尋找下一條指令到文件尾部的標籤。如果未找到標籤,則將從文件的開始處重新開始查找,直到原始goto命令的同一行。如果未找到,則會發出錯誤。

2-在前面的描述中,的下一條指令通常是指跟在goto後面的行。但是,如果goto被置於的代碼塊之內(應該永遠不要這樣做,但那是另一回事),那麼「當前指令」是放置goto的整個代碼塊。這意味着標籤可從if命令在年底尋求...

這僅僅是另一個原因,裏面的代碼塊地點標籤;這也會導致其他一些問題。

EDIT:請參閱本有趣的例子:

@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 

SECOND EDIT:下面的例子證明了標籤尋求在點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