呼叫外部程式與副程式
常用的呼叫外部程式有下列幾種方式
- call 外部程式
從批次檔中呼叫外部程式並可傳遞參數,在同一個 shell 環境下,可共同存取相同的環境變數。rem test.cmd @echo off call test1.cmd hello pause
rem test1.cmd @echo off echo %1 timeout 6
cmd /c 外部指令
呼叫一個新的shell程式(cmd)並於指令執行完成後結束這個 shell ,返回原來的shell環境,外部程式執行在新的shell之中,因此存取的環境變數與原程式不同,有區域變數的遮蔽效果@echo off cmd /c notepad.exe exit
留意上述範例執行情形,在notepad.exe關閉以前,不會執行 exit 指令,因為指令尚未結束,還留在新的shell當中。
開始一個新視窗執行程式 => start [program] [parameters]
因為 cmd /c 具有同步特性(會等外部程式執行完畢),因此不太適合呼叫需與使用者互動的視窗程式,因為命令提示視窗會因等待而保持開啟,所以適合改用 start 來呼叫執行。@echo off start notepad.exe exit
使用 /wait 也可以改讓 start 具有同步特性,詳情參考 start /?
副程式呼叫
批次檔的副程式呼叫也是利用 call 指令,不同的是 call 的對象不是外部程式 ,而是相同檔案中的標籤,也可以傳遞參數。
因為批次檔的副程式僅利用標籤代表區塊的開始,因此副程式都放在程式的尾部,之後就不要寫任何命令敘述了,代表區塊的結束。
因為批次檔循序讀取的特性,就算副程式沒有被呼叫,也會被當作標籤一般順序執行下來,因此在副程式之前通常要加上 goto :EOF 強制結束批次檔。
- call :標籤 參數1 參數2...
@echo off
rem for迴圈使用方式請參考本手冊相關章節
for %%i in (*.dll *.exe) DO CALL :SubRoutin "%%i"
pause
goto :EOF
:SubRoutin
echo %1, %~n1, %~x1