解析批處理命令call和start

call命令總結

學過匯編或C的朋友,肯定都知道call指令表示什麼意思。其實,在這裡它的意思也是一樣的。在批處理腳本中,call命令用來從一個批處理腳本中調用另一個批處理腳本。

  語法:call[ [Drive:] [Path]FileName[BatchParameters]][:label[arguments]]

  參數:[Drive:][Path]FileName指定要調用的批處理程序的位置和名稱。Filename參數必須是.bat或.cmd擴展名的類型文件。

  BatchParameters 指定批處理程序所需的命令行信息(即參數項)。

  調用另一個批處理程序,並且不終止父批處理程序(如果不用call而直接調用別的批處理文件,那麼執行完那個批處理文件後將無法返回當前文件並執行當前文件的後續命令)。

  call 命令接受用作跳轉目標的標簽。如果在腳本或批處理文件外使用call,它將不會在命令行起作用。

call命令應用

1. 基本應用。應用示例:新建兩個文本文件,一個命名為call1,修改文件的類型為bat,用Notepad++打開編輯內容為:

echo running call1

另一個命名為call2,修改文件類型為bat,用Notepad++打開編輯內容為:

 @echo off
 echo start
 call call1.bat
 echo running call2
 echo end
 pause

雙擊執行call2文件,執行結果如下所示:

過程解析:

  可以很清晰的看到,call調用類似於函數調用的執行邏輯:call2相當於執行主函數,在其執行過程中,需要調用到call1函數,當call1執行結束後,call2主函數再繼續執行本身的命令,直至整個過程結束。

  註意:call1腳本第一行沒有再寫@echo off語句。因為call2第一行已經關閉瞭命令回顯狀態,當call2調用call1時,此設置同樣有效,由此可更深入理解調用。

  

2. 調用標簽。應用示例:新建兩個文本文件,一個命名為call3,修改文件的類型為bat,用Notepad++打開編輯內容為:

@echo off
call :label
echo 1
echo 2
 
:label
echo 3
echo 4

另一個命名為call4,修改文件類型為bat,用Notepad++打開編輯內容為:

 @echo off
 call call3.bat
 pause

雙擊執行call4文件,執行結果如下所示:

過程解析:

  看到這個結果什麼感覺?讓你想起瞭什麼呢?想不起來啥?一看你若有所茫的樣子,就知道你把goto與這個搞混瞭!請看下文call命令與goto命令的區別。

3. 調用帶參數的批處理。應用示例:新建兩個文本文件,一個命名為call7,修改文件的類型為bat,用Notepad++打開編輯內容為:

 echo %1 %2
 echo %3

另一個命名為call8,修改文件類型為bat,用Notepad++打開編輯內容為:

 @echo off
 call call7.bat hello world 123
 dir c:\
 pause

雙擊執行call8文件,執行結果如下所示:

call命令與goto命令的區別

  call命令的應用示例2中,我們看到瞭call命令對跳轉標簽的調用,註意調用時必須在標簽名前加冒號,而goto是直接跟標簽名。

  同上例,我們再看看goto的執行效果:新建兩個文本文件,一個命名為call5,修改文件的類型為bat,用Notepad++打開編輯內容為:

@echo off
goto label
echo 1
echo 2
 
:label
echo 3
echo 4

另一個命名為call6,修改文件類型為bat,用Notepad++打開編輯內容為:

@echo off
call call5.bat
pause

雙擊執行call6文件,執行結果如下所示:

start命令總結

start命令簡介

start命令比較復雜。查看其幫助文檔的步驟如下:

  1. 同時按下“Win + R”鍵(或者桌面開始–>開始–>運行),打開“運行”窗口,輸入“cmd”–>確定。

  2. 在打開的命令提示符窗口裡,輸入start/?–>回車,查看“start”命令的參數和用法說明(註:按任意鍵可以查看更多後面的內容)示例截圖如下:

3. 命令提示符窗口裡,按自己的使用需要,輸入–>start/具體參數–>回車,即可按自己的需要、在Windows系統裡使用“start”命令

start命令應用

1.基本應用。打開系統計算器以及記事本。

  新建一個文本文件,命名為start1,修改文件類型為bat,用Notepad++打開編輯內容為:

 start calc
 start notepad
 exit

執行結果:分別打開計算器和記事本,同時終端一閃而過(因為最後exit)。

start命令與call命令的區別

start命令應用示例:新建兩個文本文件,一個命名為startmain,修改文件類型為bat,用Notepad++打開編輯內容為:

@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++打開編輯內容為:

 @echo off
 echo %a%
 set b=20
 pause>nul

雙擊執行startmain.bat,觀察其運行結果如下圖所示:

相同的應用,如果改為call命令:新建兩個文本文件,一個命名為callmain,修改文件類型為bat,用Notepad++打開編輯內容為:

@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++打開編輯內容為:

 @echo off
 echo %a%
 set b=20
 pause>nul

雙擊執行callmain.bat,觀察其運行結果如下圖所示:

分析結果:

  應用示例中,在main.bat中定義瞭變量a,值為1;在child.bat中定義瞭變量b,值為20。

  main.bat首先執行call child.bat,然後child.bat將執行echo %a%,現在能正常顯示1。

  call完之後,main.bat將執行echo %b%,也能正常顯示20。

  那麼,如果將call改為start,待child.bat執行完再關閉之後,main.bat繼續echo %b%,將無法顯示變量b的值,而僅相當於執行echo命令,執行結果為:ECHO處於關閉狀態。

  call的時候,他們擁有同一個殼cmd.exe,在同一個進程當中,所以他們的變量是互通的。

  start的時候,他們擁有兩個殼cmd.exe,但child.bat可以看成是main.bat的子進程,子進程可以讀取父進程中的變量(即a的值)。

總結

一是調用范圍不同:

call主要用來進行批處理的內部調用,如call:pend 和一些dos命令的調用如callsettest=2,但也可以調用其他可執行文件,而start則不能進行內部調用,但其可以執行基本上所有的外部程序,還可以執行shell,如打開文件夾start"""%WINDIR%",安裝網絡打印機start"""\\IP\Printer"等等。

二是調用方式不同:

call是嚴格意義上而言的調用,在call另一個批處理時是在同一窗體進程裡執行,而start則是執行,所以在執行另外一個批處理時是在不同的窗體進程裡進行,也就是說在新開啟的進程裡執行,雖然start可以加入b參數,但其結果卻完全不同。如我們使用callsettest=2 和 start/bsettest=2 看似執行的結果相同,但是我們發現後者有兩個進程,而且在窗體裡要執行兩次exit才能退出,所以當我們使用start來執行一個批處理後最好在被調用的批處理中也加一個exit,否則無法退出被調用的批處理的dos窗體,但是使用call調用時如果在被調用的批處理中存在exit則會直接結束原始和被調用的批處理程序,這是一個非常嚴重的問題。建議在被調用的批處理中使用goto:eof來取代exit。

三是調用結果不同:

call調用不僅可以把參數或變量傳給被調用的批處理,而且被調用的批處理也可以設置參數或變量以便回傳,而start隻能把參數或變量傳給被調用的批處理,卻不能回傳參數或變量,這一點實際上是第二點的延伸。另外,我們還必須註意一點:使用call調用其他批處理時,在被調用的批處理中若我們使用goto命令的時候,建議要使用與原批處理中不同的標簽名來跳轉,否則可能會跳轉到原批處理中而不能保證完整的執行被調用批處理中的所有語句。

到此這篇關於解析批處理命令call和start的文章就介紹到這瞭,更多相關批處理命令call和start內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!

推薦閱讀: