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