ShellExecute 為異步 API:無論目標程式執行多久、成敗與否,調用即返回。若後續邏輯依賴前一程式完成(如 bcp 導入後刷新 Grid),直接調用會導致數據未就緒。
.bat/.cmd) 命令**順序同步執行**ShellExecute 批處理 → 輪詢旗標檔存在性 → 消失即完成
set path =
bcp %1 in %2 %3 %4 其他參數
del flag.txt
// 建立旗標檔確保批處理啟動時檔案存在
FileCreate("flag.txt");
ShellExecute(0, "open", "bcp.cmd", 參數, 目錄, SW_SHOW);
while (true) {
if (!FileExists("flag.txt")) {
// bcp 已完成
break;
}
Sleep(100); // 避免佔用 CPU
}
// 後續處理:刷新 Grid 等
| 優勢 | 適用場景 |
|---|---|
| 通用性強:無視目標程式是否有 GUI/控制台 | 任何需同步等待外部進程完成的場景 | 無需進程句柄/WaitForSingleObject 等平台 API | bcp、資料庫匯入/匯出、編譯器、壓縮工具等 |
| 實現簡單,無執行緒同步複雜度 | 舊代碼快速改造、腳本化集成 |
GetTempPath()Process.Start() + WaitForExit(),原生同步、可獲取退出碼、標準輸出重導向「批處理同步 + 旗標檔案」是解決 ShellExecute 異步難題的經典巧思:利用批處理順序執行特性,將異步邊界推入腳本層,主程式以檔案系統事件同步。雖非現代最佳實踐,但在舊系統維護、跨語言調用、無進程控制權限場景下,依然極具實用價值。