談談goto for call三種句式

前言:
    在批處理中最常見的就是goto for call三種句式,而學好這種句式的重要性是不言而喻的。所以,今天我們就來簡要談談這三種句式:
一、goto句式
    go to在英名中的意思就是去向,因此goto就是批處理中的一個方向指示,如goto begin goto next goto again就是將程序分別引向:begin :next :again的標籤處,如下:


 
  1. @echo off
  2. goto begin
  3. :next
  4. echo batman
  5. pause>nul&goto :eof
  6. :begin
  7. echo bathome&goto next

複製代碼按正常的語順,應該是先顯示batman,再顯示bathome,但因爲使用了goto句式,變成了先顯示bathome,再顯示batman了。在這裏再補充一個goto後面的特殊標籤:eof,eof是英文end of file的縮寫,意思就是文件的未尾,在批處理中就是指批處理程序的結尾處(退出)或表示子程序的結束(等會在call中會有詳細說明),運用好這個goto :eof是很重要而必要的(當然前提是批處理中本無:eof標籤)。
    goto句式另一個重要的作用是在批處理中實現循環,關於這個將在下面的for中附代說明,這裏就不再贅述了。
二、for句式
    for在英文中的意思是爲,進而可以引申爲:爲每一個,而我們只要記住for句式是一個遍歷句式就行了。for句式是批處理中最強大的句式,其用法是相當複雜的,一般有五種句式形式:for for /l for /f for /r for /d,而其中最爲複雜的當屬for /f句式了。因已經有大量的教程資料對其用法進行了深入淺出的論述(本論壇也有精闢的解釋),所以本人就不在此重複了,只是提醒一下大家,要想把批處理學精,學好for是基礎。
    而我們今天所有談到的是for句式和goto句式的共同點和區別,首先我們要看兩段代碼:


 
  1. @echo off
  2. :begin
  3. set /a n+=1
  4. set /p=bathome <nul
  5. if %n% lss 10 goto begin
  6. pause>nul

複製代碼


 
  1. @echo off
  2. for /l %%i in (1,1,10) do set /p=bathome <nul
  3. pause>nul

複製代碼這兩段代碼實現的都是在同一行輸出中間以空格符格開的10個bathome,也就是說goto句式和for句式一樣實現了這個輸出循環(前面已提到了goto的循環作用),但for句式是不是顯得更爲簡潔和乾脆呢。因此,在批處理如遇對命令的循環運行,我們應儘量使用for句式,以保持代碼的簡潔和快捷。那麼是不是意味着我們要拋棄goto循環呢?當然不是,我們再來看下面這兩段代碼吧:


 
  1. @echo off
  2. :begin
  3. set /a a=%random%%%20
  4. if defined _%a% goto begin
  5. set /p=%a% <nul
  6. set /a n+=1,"_%a%=%a%"
  7. if %n% lss 5 goto begin
  8. pause>nul

複製代碼


 
  1. @echo off&setlocal enabledelayedexpansion
  2. for /l %%i in (0,1,19) do set "_%%i=%%i"
  3. for /l %%i in (0,1,19) do (
  4.     set /a a=!random!%%20
  5.     call,set "b=%%_!a!%%"
  6.     set "_!a!=!_%%i!"
  7.     set "_%%i=!b!"
  8. )
  9. for /l %%i in (0,1,4) do set /p=!_%%i! <nul
  10. pause>nul

複製代碼這兩段代碼都是實現在同一行隨機輸出5個互不相同的0-19內的數,相比之下goto循環是不是遠勝於for循環,那這是爲什麼呢?這主要是因爲單純的for循環是隻能是向前,不能向後的,而只能採用變通的辦法來處理這種情況,而goto循環卻是很靈活的,能向前也能向後,所以在批處理中對於這種需要返回上一步的循環,個人建議還是儘量採用goto循環,最好是採用goto+for雙循環如:


 
  1. @echo off&setlocal enabledelayedexpansion
  2. set "num=5"
  3. :begin
  4. set /a num-=1
  5. for /l %%i in (0,1,%num%) do (
  6.     set /a a=!random!%%20
  7.     if defined _!a! set /a num+=1&goto begin
  8.     set /p=!a! <nul&set "_!a!=!a!"&goto begin
  9. )
  10. pause>nul

複製代碼三、call句式
    call在英名中的意思是呼叫,也可引申爲調動、調用,而call在批處理中最關鍵的使用就是調用,利用call就能實現從批處理主程序中反覆調用一個或多個子程序,並從主程序中將相關的係數傳遞給子程序,傳遞的參數以%1-%9來表示的,如下面兩段代碼:


 
  1. @echo off
  2. for /l %%i in (10,1,19) do call :lp %%i
  3. pause>nul&goto :eof
  4. :lp
  5. set "str=%1"
  6. set /p=%str:~,1% <nul

複製代碼


 
  1. @echo off
  2. call :lp o k b a t h o m e
  3. pause>nul&goto :eof
  4. :lp
  5. set /p=%1%2 %3%4%5%6%7%8%9<nul

複製代碼第一段批處理主程序通過反覆調用lp字符截取子程序,實現了在同行輸出10個1。而第二個批處理則是通過call主程序的9個字符參數傳遞給了lp子程序,實現了在同行輸出ok bathome的信息。
    上面舉了for+call語式的例子,下面再來一個好玩的goto+call的例子:


 
  1. @echo off
  2. goto b
  3. :m
  4. call :sp m&goto e
  5. :a
  6. call :sp a&goto t
  7. :b
  8. call :sp b&goto a
  9. :e
  10. call :sp e
  11. pause>nul&goto :eof
  12. :h
  13. call :sp h&goto o
  14. :o
  15. call :sp o&goto m
  16. :sp
  17. set /p=%1<nul&goto :eof
  18. :t
  19. call :sp t&goto h

複製代碼呵呵,是不是很好玩啊,這其實就是靈活運用goto+call所帶來的樂趣,同樣靈活運用for+call也能給你帶來無窮樂趣,在這裏就不以例之了。
    而我在這裏要再談一談goto :eof了(前面已有描述,再次強調),大家是不是發現上面的例子中存在兩個goto :eof啊,這兩個goto :eof是起到了不同的作用,第一個是出現在主程序中間,所起的作用是結束整個批處理程序,如沒有這個goto :eof程序將得不到正常運行(大家可刪除後試一下)。而第二個是出現在sp子程序中,所起到的作用是結束子程序返回主程序,如沒有它程序也是不能正常運行的。
結束語:
    好了,今天寫了囉嗦了這麼一大通,無非就是讓大家都瞭解goto for call這三種句式的重要性(注:並不是說其它句式就不重要了如:if)。要想學好批處理,這三種句式是基礎,最後希望大家一起努力,共同提高吧。

ps:我暈,根本沒辦法排整齊,就這樣了,請大家見諒了。

http://www.bathome.net/thread-1267-1-1.html

發佈了4 篇原創文章 · 獲贊 167 · 訪問量 60萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章