BAT批次指令: GOTO 的功能介紹

BAT批次指令: GOTO 的功能介紹
Goto :將 cmd.exe 導向至批次程式裡標籤指定的定位。

指令詳解:

GOTO label

  label   指定批次程式裡做為標籤名稱的文字字串。

標籤名稱必須個別一行,並且以冒號開頭。

如果您啟動擴充指令,GOTO 指令的變更下列:

GOTO 指令接收到一個物件標籤: EOF,而此標籤會將控制傳送至目前批次指令檔的尾端。
利用此簡單的模式,可不必定義標籤便即離開批次指令檔。
輸入 CALL /? 以檢視有關CALL 擴充指令發揮此特性值的說明。

BAT批次指令: GOTO 的功能範例詳解- 一

-----------------------------------------------------------------------------------------------
• 指令:Goto   
• 說明:跳移至指定標籤,程式將執行指定標籤下一列開始的指令。 
• 備註:作用-不顯示資訊,有利於使用者自訂資訊。
• 用法:goto lable
• 參數:lable
• 例如:
       if {%1}=={} goto noparms 
          if {%2}=={}nul

-----------------------------------------------------------------------------------------------

GOTO指令在批次檔中用來轉移控制加權,可以指示批次檔跳至某一旗標(line label)由一個冒號(:)跟著字元符號所組成的;label也可使用代換變數。
Ex:
goto first 或 goto %1

範例:
建立TEST6.BAT,檔內容下列: 
@ECHO OFF 
IF EXIST C:\AUTOEXEC.BAT GOTO _COPY 
GOTO _DONE 
:_COPY 
COPY C:\AUTOEXEC.BAT D:\ 
:_DONE

注意: 
(1) 標幟前是ASCII字元的冒號":",冒號與標幟之間不能有空白字元。 
(2) 標幟的命名規則與檔案名的命名規則相同。 
(3) DOS支援最長八位元字元的標幟,當無法區別兩個標幟時,將跳轉至最近的一個標幟。

==== 注 ===================================================== 
1)標幟也稱作標籤(label) 
2)標籤不能以大多數的非字母數字字元開始, 而檔案名中則可以使用很多
3)當無法區別兩個標籤時, 將跳轉至定位最靠前的標籤 
========================================================================

BAT批次指令: GOTO 的功能範例詳解- 二

cmd goto指令 流程跳轉

goto 批次處理作業檔案執行至這裡將前往goto所指定的旗標(旗標即label,旗標用 : 後跟標準文字串來定義)處,goto敘述一般與if配合使用,根據不同的條件來執行不同的指令組。 

如: 

goto end 

:end 
echo this is the end 

旗標用" : 文字串"來定義,旗標所在行不被執行。 

一般的批次處理作業指令,都是依照自上而下的流程逐列執行的,也就是說,只有第一列的指令執行了之後,才能能執行第二列,第二列執行完之後,再執行第三列……如此依序執行。

如果對不同的情況,需要執行不同的既定操作,若還是依照一般的執行流程的話,是無法完成工作的,這個時候,就需要引入流程跳轉的概念,動用流程跳轉敘述 goto 了。

流程跳轉的含義是:改變預設的執行順序,強制跳移至指定的定位執行特定的程式塊。 

範例:假設需要判斷使用者輸入的是A還是B,原始碼可以寫成這樣: 

@echo off 
set /p input=請輸入字母A或B: 
if "%input%"=="A" goto A 
if "%input%"=="B" goto B 
pause 
exit 

:A 
echo 您輸入的字母是A 
pause 
exit 

:B 
echo 您輸入的字母是B 
pause 
exit   

依照一般的執行流程,全部的原始碼都會自上而下逐列執行一次,結果將顯示"您輸入的字母是A"和"您輸入的字母是B"這兩列內容,很顯然,這是達不到我們的要求的;
但是,實際的結果是:如果您輸入的字母非A即B,則結果只會顯示"您輸入的字母是A"或者"您輸入的字母是B";
也就是說,原始碼的執行順序發生了改變,不再一成不變地自上而下逐列執行了:當輸入字母A後,將執行第一條if敘述,此條敘述執行後,將跳移至標籤區段:A,從而繞過了第一條if敘述和:A之間的全部原始碼列;
當輸入字母B後,將執行頭兩條if敘述,當執行完第二條if敘述後,將跳移至標籤區段:B,從而繞過了第二條if敘述和:B之間的全部原始碼列。 

從上面的例子可以看至,要讓goto敘述起作用,還需要:A或:B之類的標籤區段的配合。
所謂的標籤區段,就是這樣的一些原始碼塊:在首列上以單個冒號打頭,其後緊跟一字串字元,第二列及其之後的全部列為原始碼敘述列。
在這裡,第一列的冒號是標籤標幟,緊跟他之後的文字串是標籤名,兩者合稱標籤。
goto敘述後面的部分為標籤名,指引著該敘述執行完之後該前往轉何方,標籤則接收goto敘述的跳轉指令,啟動程式著goto敘述的後續操作。
goto敘述和標籤互相呼應,在實現流程跳轉時相輔相成,缺一不可。 

使用跳轉敘述goto的注意事項: 
1、goto敘述和標籤要互相呼應,不能只有goto敘述而沒有相對的標籤區段,否則,程式將找不至相對的標籤區段而直接結束;只有標籤區段而沒有goto敘述是容許的,但不能實現流程跳轉功能,從原始碼精簡的角度來看,有標籤區段而沒有goto敘述,則此標籤是多餘的,可以精簡掉; 
2、若有多個標籤區段,則需要注意標籤區段之間是否需要新增合適的結束敘述來終止程式繼續向下執行,這是很多新手很容易犯錯的地方,需要謹慎。
3、以上面這區段原始碼為例,如果去掉:A和:B之間的exit敘述,那麼,當輸入字母A之後,結果將同時顯示"您輸入的字母是A"和"您輸入的字母是B"這兩列內容,而保留exit敘述將只會在顯示"您輸入的字母是A"後,按任意鍵推出批次處理作業程式,因為批次處理作業是自上而下逐列執行的,即使用goto敘述跳轉之後,在新的定位上,這一執行流程仍然會保持,直至碰上另一個流程跳轉敘述,執行程序並不會在兩個標籤區段之間自動終止。 
3、標籤名只可以使用常量,而不能使用變數;若有同名稱的標籤區段,將執行位於最頂層的標籤區段,其後的標籤區段是否得至執行,將視具體的情況加以處理。

BAT批次指令: GOTO 的功能範例詳解- 三


和 goto 

為什麼要把這兩個指令聯合起來介紹?因為他們是分不開的,無論少了哪個或多了哪個都會發生錯誤。

goto是個跳轉指令," : "是一個標籤。當程式執行至goto時,將自動跳移至" : "定義的部分去執行了(是不是分不開?)。

範例中行首出現一個" : "

:usage 
::set usage 

則程式在執行至goto時就自動跳移至" : "標籤定義的部分執行,結果是顯示指令碼usage(usage就是標籤名稱)。

不難看出,goto指令就是根據這個冒號和標籤名稱來尋找他該跳轉的地方,它們是一一對應的關係。 

goto指令也經常和 if 指令結合使用。 

至於這兩個指令具體用法,參照範例: 

if "%1"=="" goto usage 
::if input without paramater goto usage 
if "%1"=="/?" goto usage 
::if paramater is "/?" goto usage 
if "%1"=="help" goto usage 
::if paramater is "help" goto usage 
pause 
::pause to see usage 

goto指令的另一種用法一:提前結束程式。
在程式中間使用goto指令跳移至某一標籤,而這一標籤的內容卻定義為結束。

例如: 

…… 
goto end 
…… 
:end

留言

這個網誌中的熱門文章

BAT批次指令: For的功能介紹

BAT批次指令: COPY 的功能介紹

BAT批次指令: FINDSTR 的功能介紹