轉(zhuǎn)載自公眾號(hào):icqedu
今天是Batch入門教程的最后一章內(nèi)容:調(diào)用與傳參。相信通過(guò)前面的學(xué)習(xí),大家已經(jīng)掌握了Windows Batch有關(guān)的基礎(chǔ)知識(shí)和編程方法,以及利用Windows Batch建立初級(jí)的編程思維方式。今后我們還會(huì)學(xué)習(xí)到更多的腳本語(yǔ)言,從而更加順利投入到以后的開(kāi)發(fā)和探究中。
** 前期回顧 **
?Batch入門教程丨進(jìn)階!認(rèn)識(shí)變量相關(guān)概念
調(diào)用與傳參
雖然按照原理來(lái)講,把所有的功能都放入一個(gè)Batch文件中是可行的,但是卻會(huì)出現(xiàn)冗雜的問(wèn)題。因此,我們可以創(chuàng)建多個(gè)Batch文件,并互相調(diào)用。在Batch中,我們使用call來(lái)對(duì)Batch文件進(jìn)行調(diào)用并傳參。start也可以傳參,但是并不具備調(diào)用的性質(zhì),而僅僅是新運(yùn)行指定的對(duì)象。
call
call指令的用法與一般的指令用法相同,都只需要指定對(duì)象即可:
后面的參數(shù)可以無(wú)限疊加。
我們先舉一個(gè)比較簡(jiǎn)單的調(diào)用例子:
我們得到的結(jié)果是:
這很明顯代表著我們已經(jīng)將b.cmd打開(kāi)了。不過(guò),這不叫作「打開(kāi)」,而叫作調(diào)用(Transfer)。
我們可以看到在上面我們給出的用法里,對(duì)象后面還有一個(gè)參數(shù),而在上面的例子里卻沒(méi)有參數(shù)。這是正確的,只是功能會(huì)少一點(diǎn)而已。一般地,我們使用 call 就是為了帶上參數(shù)。接下來(lái)我們來(lái)了解怎樣使用這些參數(shù)。
首先我們要明白什么叫作參數(shù)(Parameter)。參數(shù)是指一個(gè)功能的實(shí)現(xiàn)所需要的條件和因素,它們一般都以數(shù)據(jù)的形式呈現(xiàn)。通俗來(lái)講,就是實(shí)現(xiàn)這個(gè)功能所需要的數(shù)據(jù)。例如,我們要實(shí)現(xiàn)一個(gè)做加法的功能,我們都知道:
加數(shù) + 加數(shù) = 和
那么在這個(gè)運(yùn)算中,兩個(gè)加數(shù)就是參數(shù),和是結(jié)果(result)。在編程中,這個(gè)結(jié)果叫作返回值(return value),這個(gè)流程所象征的基本意義所代指的概念叫作函數(shù)(Function)。
那么,我們既然要給別的.bat文件傳參,那么它必定會(huì)實(shí)現(xiàn)某一個(gè)功能,實(shí)現(xiàn)功能就需要參數(shù)。那么,我們?nèi)绾屋斎脒@些參數(shù)和獲取這些參數(shù)呢?
首先我們要分清楚調(diào)用方(Caller)和被調(diào)用方(Callee)。我們先假定兩個(gè)文件:a.cmd和b.cmd,它們的代碼分別如下:
您能分清楚這里誰(shuí)是調(diào)用方,誰(shuí)是被調(diào)用方嗎?調(diào)用方是a.cmd,被調(diào)用方是b.cmd,那么a.cmd就要給b.cmd傳參。a.cmd里用到了一行call指令:
對(duì)應(yīng)上面我們所表述的用法,b.cmd是對(duì)象,Hello則是一個(gè)參數(shù)。那么這個(gè)參數(shù)就相當(dāng)于是告訴b.cmd 了,接下來(lái)我們要在b.cmd里使用它。于是我們就有了這行輸出指令:
您能猜出%1的含義嗎?
它是一個(gè)變量,但不是一個(gè)標(biāo)準(zhǔn)的變量。它代表著第一個(gè)參數(shù)。在上述指令中,從Hello開(kāi)始即為參數(shù),若我們執(zhí)行:
我們得到:
在a.cmd中,我們傳參(pass)給了b.cmd。這些參數(shù)分別為:
Hello,This,is,a,sentence,.。這分別是獨(dú)立的6個(gè)參數(shù),按照從左往右的順序排序。
因此在被調(diào)用方b.cmd里,%1就代表Hello,%2就代表This,%3就代表is,以此類推。在上面的例子中,b.cmd內(nèi),%5%6寫在了一起,因?yàn)?6的值是一個(gè) .,與%5連用,結(jié)果則是sentence.。如果依然隔開(kāi),那么就是sentence .,顯示并不自然。
現(xiàn)在我們知道了如何傳參,以及如何調(diào)用參數(shù)。那么,我們處理的結(jié)果該如何返回呢?
exit /b
在Batch中 ,exit /b后必須接上數(shù)字,我們稱為exitCode即退出碼。它的作用是,當(dāng)被調(diào)用時(shí),作為被調(diào)用方,將會(huì)對(duì)調(diào)用方返回這個(gè)exitCode。只要exit 指令加上了參數(shù)/b,無(wú)論有沒(méi)有接exitCode,它所退出的都是程序而不是進(jìn)程。
這句話怎么理解呢?在第一章里我們已經(jīng)給出了圖示。如果退出的是程序,如果當(dāng)前程序是被調(diào)用方,那么它會(huì)直接返回到調(diào)用方繼續(xù)執(zhí)行指令(如果當(dāng)前程序沒(méi)有被調(diào)用,那么exit /b等價(jià)于exit),但是如果退出的是進(jìn)程,那么什么都不會(huì)做了,會(huì)將整個(gè)進(jìn)程退掉。
我們來(lái)看個(gè)例子:
上述指令中我們用到了%ERRORLEVEL%,因?yàn)閑xit /b [errorCode],作為調(diào)用方時(shí)返回的exitCode會(huì)直接充當(dāng)調(diào)用方的%ERRORLEVEL%。
上述例子我們實(shí)際上貫徹了函數(shù)的基本思想,但是在此不作具體供述。我們先看看結(jié)果:
輸出的是2,正好是1+1的和。為什么呢?請(qǐng)看流程圖:
也就是說(shuō)我們傳遞給add.cmd的兩個(gè)參數(shù)1, 1經(jīng)過(guò)add.cmd內(nèi)的一行指令set /a a=%1+%2的操作,將它們兩個(gè)加起來(lái)的值賦給了a,然后再用a當(dāng)作exitCode 使用exit /b %a% 將a的值傳回a.cmd的%ERRORLEVEL%里,最后a.cmd輸出它的值。這就是1+1的結(jié)果。
如果您仍然無(wú)法理解,可以在評(píng)論區(qū)提問(wèn)。
需要注意的是exit /b的[exitCode] 僅能為Batch可以識(shí)別的數(shù)字,因此這種傳參方式僅能夠傳回?cái)?shù)字類型的參數(shù)。
call [bin] [param...]
這種用法與先前的用法并沒(méi)有什么出入,仍然是后面跟上一個(gè)對(duì)象,以及要傳給它的參數(shù)。這一點(diǎn)在于它所調(diào)用的對(duì)象并不是Batch文件,而是Windows的系統(tǒng)文件。利用這個(gè)功能,我們幾乎可以完成任何操作。
例如,我們可以讓電腦休眠:
其中,對(duì)于不同的對(duì)象,我們能夠傳入的參數(shù)是不一樣的。如果要調(diào)用rundll32,我們就必須了解它的參數(shù),在本教程中不加以供述。對(duì)于上面一行指令powercfg,它是用來(lái)改變休眠/睡眠狀態(tài)的。如果powercfg -hibernate 設(shè)置為off,那么下面那行call 的結(jié)果就是睡眠,如果是on則是休眠。二者有一定的區(qū)別,各位可以通過(guò)搜索查看。