一般的批處理指令,都是按照自上而下的流程逐行執行的,也就是說,隻有第一行的指令執行了之後,才可能執行第二行,第二行執行完之後,再執行第三行……如此依次執行。
如果對不同的情況,需要執行不同的既定操作,若還是按照正常的執行流程的話,是無法完成任務的,這個時候,就需要引入流程跳轉的概念,動用流程跳轉語句 goto 了。流程跳轉的含義是:改變預設的執行順序,強制跳轉到指定的位置執行特定的程式塊。
先來看個例子:假設需要判斷使用者輸入的是A還是B,代碼可以寫成這樣:
@echo off
set /p input=請輸入字母A或B:
if "%input%"=="A" goto A
if "%input%"=="B" goto B
pause
goto:eof
:A
echo 您輸入的字母是A
:B
echo 您輸入的字母是B
複制代碼
按照一般的執行流程,所有的代碼都會自上而下逐行執行一次,結果将顯示"您輸入的字母是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、若有多個标簽段,則需要注意标簽段之間是否需要添加合适的退出語句來終止程式繼續向下執行,這是很多新手很容易犯錯的地方,需要謹慎。以
上面這段代碼為例,如果去掉:A和:B之間的exit語句,那麼,當輸入字母A之後,結果将同時顯示"您輸入的字母是A"和"您輸入的字母是B"這兩行内
容,而保留exit語句将隻會在顯示"您輸入的字母是A"後,按任意鍵推出批處理程式,因為批處理是自上而下逐行執行的,即使用goto語句跳轉之後,在
新的位置上,這一執行流程仍然會保持,直到碰上另一個流程跳轉語句,執行過程并不會在兩個标簽段之間自動終止。
3、标簽名隻可以使用常量,而不能使用變量;
4、若有同名的标簽段,将執行位于最頂層的标簽段,其後的标簽段是否得到執行,将視具體的情況加以處理。