解析批處理命令call和start
call命令總結(jié)
學過匯編或C的朋友,肯定都知道call指令表示什么意思。其實,在這里它的意思也是一樣的。在批處理腳本中,call命令用來從一個批處理腳本中調(diào)用另一個批處理腳本。
語法:call[ [Drive:] [Path]FileName[BatchParameters]][:label[arguments]]
參數(shù):[Drive:][Path]FileName指定要調(diào)用的批處理程序的位置和名稱。Filename參數(shù)必須是.bat或.cmd擴展名的類型文件。
BatchParameters 指定批處理程序所需的命令行信息(即參數(shù)項)。
調(diào)用另一個批處理程序,并且不終止父批處理程序(如果不用call而直接調(diào)用別的批處理文件,那么執(zhí)行完那個批處理文件后將無法返回當前文件并執(zhí)行當前文件的后續(xù)命令)。
call 命令接受用作跳轉(zhuǎn)目標的標簽。如果在腳本或批處理文件外使用call,它將不會在命令行起作用。
call命令應(yīng)用
1. 基本應(yīng)用。應(yīng)用示例:新建兩個文本文件,一個命名為call1,修改文件的類型為bat,用Notepad++打開編輯內(nèi)容為:
echo running call1
另一個命名為call2,修改文件類型為bat,用Notepad++打開編輯內(nèi)容為:
@echo off echo start call call1.bat echo running call2 echo end pause
雙擊執(zhí)行call2文件,執(zhí)行結(jié)果如下所示:
過程解析:
可以很清晰的看到,call調(diào)用類似于函數(shù)調(diào)用的執(zhí)行邏輯:call2相當于執(zhí)行主函數(shù),在其執(zhí)行過程中,需要調(diào)用到call1函數(shù),當call1執(zhí)行結(jié)束后,call2主函數(shù)再繼續(xù)執(zhí)行本身的命令,直至整個過程結(jié)束。
注意:call1腳本第一行沒有再寫@echo off語句。因為call2第一行已經(jīng)關(guān)閉了命令回顯狀態(tài),當call2調(diào)用call1時,此設(shè)置同樣有效,由此可更深入理解調(diào)用。
2. 調(diào)用標簽。應(yīng)用示例:新建兩個文本文件,一個命名為call3,修改文件的類型為bat,用Notepad++打開編輯內(nèi)容為:
@echo off call :label echo 1 echo 2 :label echo 3 echo 4
另一個命名為call4,修改文件類型為bat,用Notepad++打開編輯內(nèi)容為:
@echo off call call3.bat pause
雙擊執(zhí)行call4文件,執(zhí)行結(jié)果如下所示:
過程解析:
看到這個結(jié)果什么感覺?讓你想起了什么呢?想不起來啥?一看你若有所茫的樣子,就知道你把goto與這個搞混了!請看下文call命令與goto命令的區(qū)別。
3. 調(diào)用帶參數(shù)的批處理。應(yīng)用示例:新建兩個文本文件,一個命名為call7,修改文件的類型為bat,用Notepad++打開編輯內(nèi)容為:
echo %1 %2 echo %3
另一個命名為call8,修改文件類型為bat,用Notepad++打開編輯內(nèi)容為:
@echo off call call7.bat hello world 123 dir c:\ pause
雙擊執(zhí)行call8文件,執(zhí)行結(jié)果如下所示:
call命令與goto命令的區(qū)別
call命令的應(yīng)用示例2中,我們看到了call命令對跳轉(zhuǎn)標簽的調(diào)用,注意調(diào)用時必須在標簽名前加冒號,而goto是直接跟標簽名。
同上例,我們再看看goto的執(zhí)行效果:新建兩個文本文件,一個命名為call5,修改文件的類型為bat,用Notepad++打開編輯內(nèi)容為:
@echo off goto label echo 1 echo 2 :label echo 3 echo 4
另一個命名為call6,修改文件類型為bat,用Notepad++打開編輯內(nèi)容為:
@echo off call call5.bat pause
雙擊執(zhí)行call6文件,執(zhí)行結(jié)果如下所示:
start命令總結(jié)
start命令簡介
start命令比較復雜。查看其幫助文檔的步驟如下:
1. 同時按下“Win + R”鍵(或者桌面開始-->開始-->運行),打開“運行”窗口,輸入“cmd”-->確定。
2. 在打開的命令提示符窗口里,輸入start/?-->回車,查看“start”命令的參數(shù)和用法說明(注:按任意鍵可以查看更多后面的內(nèi)容)示例截圖如下:
3. 命令提示符窗口里,按自己的使用需要,輸入-->start/具體參數(shù)-->回車,即可按自己的需要、在Windows系統(tǒng)里使用“start”命令
start命令應(yīng)用
1.基本應(yīng)用。打開系統(tǒng)計算器以及記事本。
新建一個文本文件,命名為start1,修改文件類型為bat,用Notepad++打開編輯內(nèi)容為:
start calc start notepad exit
執(zhí)行結(jié)果:分別打開計算器和記事本,同時終端一閃而過(因為最后exit)。
start命令與call命令的區(qū)別
start命令應(yīng)用示例:新建兩個文本文件,一個命名為startmain,修改文件類型為bat,用Notepad++打開編輯內(nèi)容為:
@echo off set a=1 pause>nul echo start startchild.bat start startchild.bat echo end start pause>nul echo %b% pause>nul
一個命名為startchild,修改文件類型為bat,用Notepad++打開編輯內(nèi)容為:
@echo off echo %a% set b=20 pause>nul
雙擊執(zhí)行startmain.bat,觀察其運行結(jié)果如下圖所示:
相同的應(yīng)用,如果改為call命令:新建兩個文本文件,一個命名為callmain,修改文件類型為bat,用Notepad++打開編輯內(nèi)容為:
@echo off set a=1 pause>nul echo call callchild.bat call callchild.bat echo end call pause>nul echo %b% pause>nul
一個命名為callchild,修改文件類型為bat,用Notepad++打開編輯內(nèi)容為:
@echo off echo %a% set b=20 pause>nul
雙擊執(zhí)行callmain.bat,觀察其運行結(jié)果如下圖所示:
分析結(jié)果:
應(yīng)用示例中,在main.bat中定義了變量a,值為1;在child.bat中定義了變量b,值為20。
main.bat首先執(zhí)行call child.bat,然后child.bat將執(zhí)行echo %a%,現(xiàn)在能正常顯示1。
call完之后,main.bat將執(zhí)行echo %b%,也能正常顯示20。
那么,如果將call改為start,待child.bat執(zhí)行完再關(guān)閉之后,main.bat繼續(xù)echo %b%,將無法顯示變量b的值,而僅相當于執(zhí)行echo命令,執(zhí)行結(jié)果為:ECHO處于關(guān)閉狀態(tài)。
call的時候,他們擁有同一個殼cmd.exe,在同一個進程當中,所以他們的變量是互通的。
start的時候,他們擁有兩個殼cmd.exe,但child.bat可以看成是main.bat的子進程,子進程可以讀取父進程中的變量(即a的值)。
總結(jié)
一是調(diào)用范圍不同:
call主要用來進行批處理的內(nèi)部調(diào)用,如call:pend 和一些dos命令的調(diào)用如callsettest=2,但也可以調(diào)用其他可執(zhí)行文件,而start則不能進行內(nèi)部調(diào)用,但其可以執(zhí)行基本上所有的外部程序,還可以執(zhí)行shell,如打開文件夾start"""%WINDIR%",安裝網(wǎng)絡(luò)打印機start"""\\IP\Printer"等等。
二是調(diào)用方式不同:
call是嚴格意義上而言的調(diào)用,在call另一個批處理時是在同一窗體進程里執(zhí)行,而start則是執(zhí)行,所以在執(zhí)行另外一個批處理時是在不同的窗體進程里進行,也就是說在新開啟的進程里執(zhí)行,雖然start可以加入b參數(shù),但其結(jié)果卻完全不同。如我們使用callsettest=2 和 start/bsettest=2 看似執(zhí)行的結(jié)果相同,但是我們發(fā)現(xiàn)后者有兩個進程,而且在窗體里要執(zhí)行兩次exit才能退出,所以當我們使用start來執(zhí)行一個批處理后最好在被調(diào)用的批處理中也加一個exit,否則無法退出被調(diào)用的批處理的dos窗體,但是使用call調(diào)用時如果在被調(diào)用的批處理中存在exit則會直接結(jié)束原始和被調(diào)用的批處理程序,這是一個非常嚴重的問題。建議在被調(diào)用的批處理中使用goto:eof來取代exit。
三是調(diào)用結(jié)果不同:
call調(diào)用不僅可以把參數(shù)或變量傳給被調(diào)用的批處理,而且被調(diào)用的批處理也可以設(shè)置參數(shù)或變量以便回傳,而start只能把參數(shù)或變量傳給被調(diào)用的批處理,卻不能回傳參數(shù)或變量,這一點實際上是第二點的延伸。另外,我們還必須注意一點:使用call調(diào)用其他批處理時,在被調(diào)用的批處理中若我們使用goto命令的時候,建議要使用與原批處理中不同的標簽名來跳轉(zhuǎn),否則可能會跳轉(zhuǎn)到原批處理中而不能保證完整的執(zhí)行被調(diào)用批處理中的所有語句。
到此這篇關(guān)于解析批處理命令call和start的文章就介紹到這了,更多相關(guān)批處理命令call和start內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
BAT批處理判斷服務(wù)是否正常運行的方法(批處理命令綜合應(yīng)用)
批處理就是對某對象進行批量的處理,通常被認為是一種簡化的腳本語言,它應(yīng)用于DOS和Windows系統(tǒng)中。這篇文章主要介紹了BAT批處理判斷服務(wù)是否正常運行(批處理命令綜合應(yīng)用),需要的朋友可以參考下2020-02-02批處理bat將txt文本第一列內(nèi)容相同的行的最后一列的數(shù)字相加
這篇文章主要介紹了批處理bat將txt文本第一列內(nèi)容相同的行的最后一列的數(shù)字相加,需要的朋友可以參考下2021-09-09