批處理命令之函數(shù)傳參和跳轉(zhuǎn)詳解
函數(shù)
函數(shù)封裝是編程語(yǔ)言必不可少的環(huán)節(jié),而函數(shù)在創(chuàng)建時(shí),至少需要有一個(gè)函數(shù)標(biāo)識(shí),同時(shí)需要一塊區(qū)域,來(lái)組成函數(shù)體。Dos中的函數(shù)用標(biāo)簽來(lái)標(biāo)識(shí),以goto:eof結(jié)束,比如現(xiàn)在新建一個(gè)腳本func.bat
@echo off call:func echo end of call goto:eof :func echo call me goto:eof
上面4行類(lèi)似于主函數(shù),@echo off關(guān)閉回顯,然后調(diào)用func,調(diào)用結(jié)束之后打印end of call,最后使用goto:eof,結(jié)束命令行。
下面三行可以理解為自定義函數(shù),內(nèi)容是打印call me。
運(yùn)行結(jié)果如下
>test.bat
call me
end of call
即命令行先打印了call me,后打印end of call,說(shuō)明其運(yùn)行過(guò)程的確是先調(diào)用了func,然后再執(zhí)行的echo end of call。
參數(shù)傳遞
對(duì)于一個(gè)腳本來(lái)說(shuō),如果想在調(diào)用bat文件時(shí)進(jìn)行參數(shù)傳遞,則可用%或者%~來(lái)標(biāo)識(shí)傳進(jìn)來(lái)的參數(shù),二者的區(qū)別是,后者會(huì)自動(dòng)刪除參數(shù)中的引號(hào),而前者不會(huì)。例如下面一個(gè)名為para.bat的腳本
:: para.bat @echo you've given me %1 or %~1
在命令行中調(diào)用的結(jié)果如下
>para "123"
you've given me "123" or 123
函數(shù)傳參也采用了這種邏輯,下面修改test.bat腳本如下
@echo off call:func 100 echo end of call goto:eof :func echo you've given me %1 goto:eof
運(yùn)行結(jié)果如下
>test.bat
you've given me 100
end of call
返回值
DOS函數(shù)沒(méi)有返回值,若想保留函數(shù)中的計(jì)算結(jié)果,要么將其設(shè)為全局變量,要么采用“參數(shù)引用”,即直接更改傳入?yún)?shù)的值。先來(lái)看第一種
:: func1.bat @echo off call :sum 10 20 echo sum(10,20)=%result% goto :eof :sum set /a result=%1 + %2 goto :eof
其中采用set指令,將result設(shè)為傳入兩個(gè)參數(shù)的和,隨后在主程序中直接調(diào)用%result%,并得到了正確的結(jié)果,如下所示
>func1
sum(10,20)=30
另一種方法u是直接把想要返回的變量作為參數(shù)傳入函數(shù)中,示例如下
:: func2.bat @echo off call :sum 10 20 result echo sum(10, 20)=%result% goto :eof ???????:sum set /a %3=%1 + %2 goto :eof
這里面把result作為參數(shù)傳入了sum函數(shù)中,而sum函數(shù)的邏輯是,讓傳入的第三個(gè)參數(shù)等于前兩個(gè)參數(shù)之和,這樣就在不創(chuàng)建“全局變量”的情況下,對(duì)result賦值了。
局部變量保護(hù)
通過(guò)set命令創(chuàng)建的變量,默認(rèn)就是全局的,這一點(diǎn)已經(jīng)在func1.bat中得到了認(rèn)證。但全局變量太多容易導(dǎo)致程序變得混亂,雖然不太可能用批處理語(yǔ)句去寫(xiě)什么大工程,但就算用了兩次for循環(huán),都會(huì)引起全局變量變化的風(fēng)險(xiǎn),所以局部變量保護(hù)還是有存在的意義的。
在批處理語(yǔ)句中,setlocal和endlocal中間的函數(shù)段,set所設(shè)置的參數(shù)便是局部的。為此可對(duì)func1的sum函數(shù)稍作修改
:: func3.bat :: 主程序與func1.bat相同 :sum setlocal set /a result=%1 + %2 endlocal goto :eof
這樣運(yùn)行結(jié)果就會(huì)變成
>func3.bat
sum(10,20)=
也就是說(shuō),result并沒(méi)有被賦值。
goto
goto是鼎鼎大名的跳轉(zhuǎn)指令,曾在歷史上引起過(guò)嚴(yán)重災(zāi)難,但對(duì)于命令行這種臨時(shí)使用的代碼很短的腳本來(lái)說(shuō),則算是無(wú)傷大雅。其作用是跳轉(zhuǎn)到某個(gè)標(biāo)簽所在的區(qū)塊,而標(biāo)簽則以冒號(hào)開(kāi)頭。
由此觀之,:eof就是一個(gè)默認(rèn)的局部標(biāo)簽,表示當(dāng)前程序的結(jié)尾。下面做一個(gè)簡(jiǎn)單的示例,用goto跳轉(zhuǎn)來(lái)打印BAT這三個(gè)字母。
:: BAT.bat @echo off goto:B goto:eof :A echo A goto :T :B echo B goto :A :T echo T
效果如下
>bat
B
A
T
到此這篇關(guān)于批處理命令之函數(shù)傳參和跳轉(zhuǎn)詳解的文章就介紹到這了,更多相關(guān)批處理命令內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
寫(xiě)一個(gè)bat批處理文件啟動(dòng)windows進(jìn)程和延時(shí)關(guān)閉的代碼
一個(gè)實(shí)現(xiàn)啟動(dòng)windows進(jìn)程和延時(shí)關(guān)閉的bat批處理文件,用于打開(kāi)IE與關(guān)閉IE,學(xué)習(xí)批處理的朋友可以參考下。2010-11-11批處理bat判斷一個(gè)文件在最近5分鐘內(nèi)是否被更新過(guò)的代碼
這篇文章主要介紹了批處理bat判斷一個(gè)文件在最近5分鐘內(nèi)是否被更新過(guò)的代碼,需要的朋友可以參考下2014-07-07bat文件與Vbs文件之間的常用操作(獲取用戶(hù)輸入,執(zhí)行VBS文件)
這篇文章主要介紹了bat文件與Vbs文件之間的常用操作(獲取用戶(hù)輸入,執(zhí)行VBS文件),需要的朋友可以參考下2022-11-11Windows和Linux下定時(shí)刪除某天前的文件的腳本
無(wú)論是在windows下還是linux下,很多的日志文件如果不定時(shí)刪除會(huì)充滿(mǎn)硬盤(pán),所以可以分別寫(xiě)個(gè)腳本定時(shí)處理一下2014-08-08Windows命令行bat批處理延遲sleep方法(批處理延時(shí))
這篇文章主要介紹了Windows命令行bat批處理延遲sleep方法,需要的朋友可以參考下2016-02-02最基本的實(shí)現(xiàn)進(jìn)度條效果的批處理
最基本的實(shí)現(xiàn)進(jìn)度條效果的批處理,需要的朋友可以參考下。2011-02-02可疑文件的批處理最好能用循環(huán)來(lái)寫(xiě)主體部分
可疑文件的批處理最好能用循環(huán)來(lái)寫(xiě)主體部分...2007-08-08