start與call的區別

1.call是從批處理程序調用另一個批處理程序,並且不終止父批處理程序(如果不用call而直接調用別的批處理文件,那麼執行完那個批處理文件後將無法返回當前文件並執行當前文件的後續命令);而start是啓動一個單獨的窗口運行指定的程序或命令。

2.call命令能夠調用標籤,與goto命令的區別是:採用 call:label的形式(goto採用的形式是goto label,沒有冒號),並且採用call調用完標籤之後,會繼續順序執行後續命令,而goto則是直接跳轉至標籤進行執行,並順序執行標籤後的內容;start不能夠調用標籤。

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

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

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



作者:Sec小玖
鏈接:https://www.jianshu.com/p/13070f48099a
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章