前言:
在批處理中最常見的就是goto for call三種句式,而學好這種句式的重要性是不言而喻的。所以,今天我們就來簡要談談這三種句式:
一、goto句式
go to在英名中的意思就是去向,因此goto就是批處理中的一個方向指示,如goto begin goto next goto again就是將程序分別引向:begin :next :again的標籤處,如下:
- @echo off
- goto begin
- :next
- echo batman
- pause>nul&goto :eof
- :begin
- 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句式的共同點和區別,首先我們要看兩段代碼:
- @echo off
- :begin
- set /a n+=1
- set /p=bathome <nul
- if %n% lss 10 goto begin
- pause>nul
複製代碼
- @echo off
- for /l %%i in (1,1,10) do set /p=bathome <nul
- pause>nul
複製代碼這兩段代碼實現的都是在同一行輸出中間以空格符格開的10個bathome,也就是說goto句式和for句式一樣實現了這個輸出循環(前面已提到了goto的循環作用),但for句式是不是顯得更爲簡潔和乾脆呢。因此,在批處理如遇對命令的循環運行,我們應儘量使用for句式,以保持代碼的簡潔和快捷。那麼是不是意味着我們要拋棄goto循環呢?當然不是,我們再來看下面這兩段代碼吧:
- @echo off
- :begin
- set /a a=%random%%%20
- if defined _%a% goto begin
- set /p=%a% <nul
- set /a n+=1,"_%a%=%a%"
- if %n% lss 5 goto begin
- pause>nul
複製代碼
- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (0,1,19) do set "_%%i=%%i"
- for /l %%i in (0,1,19) do (
- set /a a=!random!%%20
- call,set "b=%%_!a!%%"
- set "_!a!=!_%%i!"
- set "_%%i=!b!"
- )
- for /l %%i in (0,1,4) do set /p=!_%%i! <nul
- pause>nul
複製代碼這兩段代碼都是實現在同一行隨機輸出5個互不相同的0-19內的數,相比之下goto循環是不是遠勝於for循環,那這是爲什麼呢?這主要是因爲單純的for循環是隻能是向前,不能向後的,而只能採用變通的辦法來處理這種情況,而goto循環卻是很靈活的,能向前也能向後,所以在批處理中對於這種需要返回上一步的循環,個人建議還是儘量採用goto循環,最好是採用goto+for雙循環如:
- @echo off&setlocal enabledelayedexpansion
- set "num=5"
- :begin
- set /a num-=1
- for /l %%i in (0,1,%num%) do (
- set /a a=!random!%%20
- if defined _!a! set /a num+=1&goto begin
- set /p=!a! <nul&set "_!a!=!a!"&goto begin
- )
- pause>nul
複製代碼三、call句式
call在英名中的意思是呼叫,也可引申爲調動、調用,而call在批處理中最關鍵的使用就是調用,利用call就能實現從批處理主程序中反覆調用一個或多個子程序,並從主程序中將相關的係數傳遞給子程序,傳遞的參數以%1-%9來表示的,如下面兩段代碼:
- @echo off
- for /l %%i in (10,1,19) do call :lp %%i
- pause>nul&goto :eof
- :lp
- set "str=%1"
- set /p=%str:~,1% <nul
複製代碼
- @echo off
- call :lp o k b a t h o m e
- pause>nul&goto :eof
- :lp
- set /p=%1%2 %3%4%5%6%7%8%9<nul
複製代碼第一段批處理主程序通過反覆調用lp字符截取子程序,實現了在同行輸出10個1。而第二個批處理則是通過call主程序的9個字符參數傳遞給了lp子程序,實現了在同行輸出ok bathome的信息。
上面舉了for+call語式的例子,下面再來一個好玩的goto+call的例子:
- @echo off
- goto b
- :m
- call :sp m&goto e
- :a
- call :sp a&goto t
- :b
- call :sp b&goto a
- :e
- call :sp e
- pause>nul&goto :eof
- :h
- call :sp h&goto o
- :o
- call :sp o&goto m
- :sp
- set /p=%1<nul&goto :eof
- :t
- call :sp t&goto h
複製代碼呵呵,是不是很好玩啊,這其實就是靈活運用goto+call所帶來的樂趣,同樣靈活運用for+call也能給你帶來無窮樂趣,在這裏就不以例之了。
而我在這裏要再談一談goto :eof了(前面已有描述,再次強調),大家是不是發現上面的例子中存在兩個goto :eof啊,這兩個goto :eof是起到了不同的作用,第一個是出現在主程序中間,所起的作用是結束整個批處理程序,如沒有這個goto :eof程序將得不到正常運行(大家可刪除後試一下)。而第二個是出現在sp子程序中,所起到的作用是結束子程序返回主程序,如沒有它程序也是不能正常運行的。
結束語:
好了,今天寫了囉嗦了這麼一大通,無非就是讓大家都瞭解goto for call這三種句式的重要性(注:並不是說其它句式就不重要了如:if)。要想學好批處理,這三種句式是基礎,最後希望大家一起努力,共同提高吧。
ps:我暈,根本沒辦法排整齊,就這樣了,請大家見諒了。