doc call呼叫外部程式與副程式

呼叫外部程式與副程式

常用的呼叫外部程式有下列幾種方式
  1. call 外部程式
    從批次檔中呼叫外部程式並可傳遞參數,在同一個 shell 環境下,可共同存取相同的環境變數。
    rem test.cmd
    @echo off
    call test1.cmd hello
    pause
    
    rem test1.cmd
    @echo off
    echo %1
    timeout 6
    
  2. cmd /c 外部指令
    呼叫一個新的shell程式(cmd)並於指令執行完成後結束這個 shell ,返回原來的shell環境,外部程式執行在新的shell之中,因此存取的環境變數與原程式不同,有區域變數的遮蔽效果
    @echo off
    cmd /c notepad.exe
    exit
    
    留意上述範例執行情形,在notepad.exe關閉以前,不會執行 exit 指令,因為指令尚未結束,還留在新的shell當中。
  3. 開始一個新視窗執行程式 => 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

留言

這個網誌中的熱門文章

格式透視 - 解析 PE 文件格式