標籤:log tool not 檔案夾 理解 int sharp 用法 src
參考:https://www.cnblogs.com/Braveliu/p/5078283.html
一、call命令總結
(1)call命令簡介
文法: call [ [Drive:] [Path] FileName [BatchParameters]] [:label [arguments]]
參數: [Drive:][Path] FileName 指定要調用的批次程式的位置和名稱。Filename 參數必須是.bat 或 .cmd 副檔名的類型檔案。
BatchParameters 指定批次程式所需的命令列資訊(即參數項)。
調用另一個批次程式,並且不終止父批次程式(如果不用call而直接調用別的批次檔,那麼執行完那個批次檔後將無法返回當前檔案並執行當前檔案的後續命令)。
call 命令接受用作跳轉目標的標籤。如果在指令碼或批次檔外使用call,它將不會在命令列起作用。
(2)call命令應用
test1: 建立兩個文字檔,一個命名為call1.bat.
1 echo running in call1
另一個命名為call2,修改檔案類型為bat,用Notepad++開啟編輯內容為:
1 @echo off2 echo start3 call call1.bat4 echo running in call25 echo end6 pause
注意:call1指令碼第一行沒有再寫@echo off語句。因為call2第一行已經關閉了命令回顯狀態,當call2調用call1時,此設定同樣有效,由此可更深入理解調用。
test2: 調用標籤。
1 @echo off2 call :label3 echo 14 echo 25 6 :label7 echo 38 echo 4
另一個命名為call4
1 @echo off2 call call3.bat3 pause
雙擊執行call4檔案,執行結果如下所示:
test3:調用帶參數的批處理
1 echo %1 %22 echo %3
另一個命名為call8,修改檔案類型為bat,用Notepad++開啟編輯內容為:
1 @echo off2 call call7.bat hello world !3 dir c:4 pause
(3)call命令與goto命令的區別
call命令的應用樣本2中,我們看到了call命令對跳轉標籤的調用,注意調用時必須在標籤名前加冒號,而goto是直接跟標籤名。
同上例,我們再看看goto的執行效果:建立兩個文字檔,一個命名為call5
1 @echo off2 goto label3 echo 14 echo 25 6 :label7 echo 38 echo 4
另一個命名為call6,修改檔案類型為bat,用Notepad++開啟編輯內容為:
1 @echo off2 call call5.bat3 pause
雙擊執行call6檔案,執行結果如下所示:
二、start命令總結
(1)start命令簡介
在開啟的命令提示字元視窗裡,輸入start/?-->斷行符號,查看“start”命令的參數和用法說明(註:按任意鍵可以查看更多後面的內容)樣本如下:
(2)start命令應用
test1 :基本應用。開啟系統計算機以及記事本。
建立一個文字檔,命名為start1,修改檔案類型為bat,用Notepad++開啟編輯內容為:
1 start calc2 start notepad3 exit
執行結果:分別開啟計算機和記事本,同時終端一閃而過(因為最後exit)。
(3)start命令與call命令的區別
start命令應用樣本:建立兩個文字檔,一個命名為startmain,修改檔案類型為bat,用Notepad++開啟編輯內容為:
1 @echo off2 set a=13 pause>nul4 echo start startchild.bat5 start startchild.bat6 echo end start7 pause>nul8 echo %b%9 pause>nul
一個命名為startchild,修改檔案類型為bat,用Notepad++開啟編輯內容為:
1 @echo off2 echo %a%3 set b=204 pause>nul
雙擊執行startmain.bat,觀察其運行結果如所示:
相同的應用,如果改為call命令:建立兩個文字檔,一個命名為callmain,修改檔案類型為bat,用Notepad++開啟編輯內容為:
1 @echo off2 set a=13 pause>nul4 echo call callchild.bat5 call callchild.bat6 echo end call7 pause>nul8 echo %b%9 pause>nul
一個命名為callchild,修改檔案類型為bat,用Notepad++開啟編輯內容為:
1 @echo off2 echo %a%3 set b=204 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的值)。
總結結論:
對於start,概況二句話:“不同進程不能傳值”,“相同進程單向傳值,老子傳兒子,非兒子傳老子”。
對於call,“同一進程,變數互連”。
另外,可以從以下幾方面理解start與call命令的區別:
一是調用範圍不同:call主要用來進行批處理的內部調用,如call :pend 和一些dos命令的調用如call set test=2,但也可以調用其他可執行檔,而start則不能進行內部調用,但其可以執行基本上所有的外部程式,還可以執行shell,如開啟檔案夾start "" "%WINDIR%",安裝網路印表機start "" "\\IP\Printer"等等。
二是調用方式不同:call是嚴格意義上而言的調用,在call另一個批處理時是在同一表單進程裡執行,而start則是執行,所以在執行另外一個批處理時是在不同的表單進程裡進行,也就是說在新開啟的進程裡執行,雖然start可以加入b參數,但其結果卻完全不同。如我們使用call set test=2 和 start /b set test=2 看似執行的結果相同,但是我們發現後者有兩個進程,而且在表單裡要執行兩次exit才能退出,所以當我們使用start來執行一個批處理後最好在被調用的批處理中也加一個exit,否則無法退出被調用的批處理的dos表單,但是使用call調用時如果在被調用的批處理中存在exit則會直接結束原始和被調用的批次程式,這是一個非常嚴重的問題。建議在被調用的批處理中使用goto :eof來取代exit。
三是調用結果不同:call調用不僅可以把參數或變數傳給被調用的批處理,而且被調用的批處理也可以設定參數或變數以便回傳,而start只能把參數或變數傳給被調用的批處理,卻不能回傳參數或變數,這一點實際上是第二點的延伸。另外,我們還必須注意一點:使用call調用其他批處理時,在被調用的批處理中若我們使用goto命令的時候,建議要使用與原批處理中不同的標籤名來跳轉,否則可能會跳轉到原批處理中而不能保證完整的執行被調用批處理中的所有語句。
windows批處理學習(call與start)---02