轉(zhuǎn)載自公眾號:icqedu
今天是Batch入門教程的最后一章內(nèi)容:調(diào)用與傳參。相信通過前面的學(xué)習(xí)唠梨,大家已經(jīng)掌握了Windows Batch有關(guān)的基礎(chǔ)知識和編程方法,以及利用Windows Batch建立初級的編程思維方式侥啤。今后我們還會學(xué)習(xí)到更多的腳本語言当叭,從而更加順利投入到以后的開發(fā)和探究中茬故。
** 前期回顧 **
?Batch入門教程丨進(jìn)階!認(rèn)識變量相關(guān)概念
調(diào)用與傳參
雖然按照原理來講磺芭,把所有的功能都放入一個Batch文件中是可行的,但是卻會出現(xiàn)冗雜的問題醉箕。因此钾腺,我們可以創(chuàng)建多個Batch文件,并互相調(diào)用讥裤。在Batch中放棒,我們使用call來對Batch文件進(jìn)行調(diào)用并傳參。start也可以傳參坞琴,但是并不具備調(diào)用的性質(zhì)哨查,而僅僅是新運行指定的對象。
call
call指令的用法與一般的指令用法相同剧辐,都只需要指定對象即可:
后面的參數(shù)可以無限疊加。
我們先舉一個比較簡單的調(diào)用例子:
我們得到的結(jié)果是:
這很明顯代表著我們已經(jīng)將b.cmd打開了邮府。不過荧关,這不叫作「打開」,而叫作調(diào)用(Transfer)褂傀。
我們可以看到在上面我們給出的用法里忍啤,對象后面還有一個參數(shù),而在上面的例子里卻沒有參數(shù)仙辟。這是正確的同波,只是功能會少一點而已。一般地叠国,我們使用 call 就是為了帶上參數(shù)未檩。接下來我們來了解怎樣使用這些參數(shù)。
首先我們要明白什么叫作參數(shù)(Parameter)粟焊。參數(shù)是指一個功能的實現(xiàn)所需要的條件和因素冤狡,它們一般都以數(shù)據(jù)的形式呈現(xiàn)。通俗來講项棠,就是實現(xiàn)這個功能所需要的數(shù)據(jù)悲雳。例如,我們要實現(xiàn)一個做加法的功能香追,我們都知道:
加數(shù) + 加數(shù) = 和
那么在這個運算中合瓢,兩個加數(shù)就是參數(shù),和是結(jié)果(result)透典。在編程中晴楔,這個結(jié)果叫作返回值(return value)顿苇,這個流程所象征的基本意義所代指的概念叫作函數(shù)(Function)。
那么滥崩,我們既然要給別的.bat文件傳參岖圈,那么它必定會實現(xiàn)某一個功能,實現(xiàn)功能就需要參數(shù)钙皮。那么蜂科,我們?nèi)绾屋斎脒@些參數(shù)和獲取這些參數(shù)呢?
首先我們要分清楚調(diào)用方(Caller)和被調(diào)用方(Callee)短条。我們先假定兩個文件:a.cmd和b.cmd导匣,它們的代碼分別如下:
您能分清楚這里誰是調(diào)用方,誰是被調(diào)用方嗎茸时?調(diào)用方是a.cmd贡定,被調(diào)用方是b.cmd,那么a.cmd就要給b.cmd傳參可都。a.cmd里用到了一行call指令:
對應(yīng)上面我們所表述的用法缓待,b.cmd是對象,Hello則是一個參數(shù)渠牲。那么這個參數(shù)就相當(dāng)于是告訴b.cmd 了旋炒,接下來我們要在b.cmd里使用它。于是我們就有了這行輸出指令:
您能猜出%1的含義嗎签杈?
它是一個變量瘫镇,但不是一個標(biāo)準(zhǔn)的變量。它代表著第一個參數(shù)答姥。在上述指令中铣除,從Hello開始即為參數(shù),若我們執(zhí)行:
我們得到:
在a.cmd中鹦付,我們傳參(pass)給了b.cmd尚粘。這些參數(shù)分別為:
Hello,This,is,a,sentence,.。這分別是獨立的6個參數(shù)睁壁,按照從左往右的順序排序背苦。
因此在被調(diào)用方b.cmd里,%1就代表Hello潘明,%2就代表This行剂,%3就代表is,以此類推钳降。在上面的例子中厚宰,b.cmd內(nèi),%5%6寫在了一起,因為%6的值是一個 .铲觉,與%5連用澈蝙,結(jié)果則是sentence.。如果依然隔開撵幽,那么就是sentence .灯荧,顯示并不自然。
現(xiàn)在我們知道了如何傳參盐杂,以及如何調(diào)用參數(shù)逗载。那么,我們處理的結(jié)果該如何返回呢链烈?
exit /b
在Batch中 厉斟,exit /b后必須接上數(shù)字,我們稱為exitCode即退出碼强衡。它的作用是擦秽,當(dāng)被調(diào)用時,作為被調(diào)用方漩勤,將會對調(diào)用方返回這個exitCode感挥。只要exit 指令加上了參數(shù)/b,無論有沒有接exitCode,它所退出的都是程序而不是進(jìn)程瓢湃。
這句話怎么理解呢?在第一章里我們已經(jīng)給出了圖示。如果退出的是程序嗡综,如果當(dāng)前程序是被調(diào)用方,那么它會直接返回到調(diào)用方繼續(xù)執(zhí)行指令(如果當(dāng)前程序沒有被調(diào)用挨下,那么exit /b等價于exit)侠仇,但是如果退出的是進(jìn)程,那么什么都不會做了筑累,會將整個進(jìn)程退掉袱蜡。
我們來看個例子:
上述指令中我們用到了%ERRORLEVEL%,因為exit /b [errorCode]慢宗,作為調(diào)用方時返回的exitCode會直接充當(dāng)調(diào)用方的%ERRORLEVEL%坪蚁。
上述例子我們實際上貫徹了函數(shù)的基本思想,但是在此不作具體供述镜沽。我們先看看結(jié)果:
輸出的是2敏晤,正好是1+1的和。為什么呢缅茉?請看流程圖:
也就是說我們傳遞給add.cmd的兩個參數(shù)1, 1經(jīng)過add.cmd內(nèi)的一行指令set /a a=%1+%2的操作嘴脾,將它們兩個加起來的值賦給了a,然后再用a當(dāng)作exitCode 使用exit /b %a% 將a的值傳回a.cmd的%ERRORLEVEL%里,最后a.cmd輸出它的值译打。這就是1+1的結(jié)果耗拓。
如果您仍然無法理解,可以在評論區(qū)提問奏司。
需要注意的是exit /b的[exitCode] 僅能為Batch可以識別的數(shù)字乔询,因此這種傳參方式僅能夠傳回數(shù)字類型的參數(shù)。
call [bin] [param...]
這種用法與先前的用法并沒有什么出入韵洋,仍然是后面跟上一個對象竿刁,以及要傳給它的參數(shù)。這一點在于它所調(diào)用的對象并不是Batch文件麻献,而是Windows的系統(tǒng)文件们妥。利用這個功能,我們幾乎可以完成任何操作勉吻。
例如监婶,我們可以讓電腦休眠:
其中,對于不同的對象齿桃,我們能夠傳入的參數(shù)是不一樣的惑惶。如果要調(diào)用rundll32,我們就必須了解它的參數(shù)短纵,在本教程中不加以供述带污。對于上面一行指令powercfg,它是用來改變休眠/睡眠狀態(tài)的香到。如果powercfg -hibernate 設(shè)置為off鱼冀,那么下面那行call 的結(jié)果就是睡眠,如果是on則是休眠悠就。二者有一定的區(qū)別千绪,各位可以通過搜索查看。