我正在使用CreateProcess通過Cygwin的bash.exe調用bash腳本。腳本運行良好,我甚至可以重定向stdout和stderr以在我自己的窗口中顯示。唯一的問題是,我似乎無法獲得bash腳本的退出代碼。如何從用winApi CreateProcess調用的bash腳本獲取退出代碼?
這裏是我如何啓動腳本:
PROCESS_INFORMATION pi;
ZeroMemory(&pi, sizeof(pi));
STARTUPINFO si;
si.cb = sizeof (STARTUPINFO);
si.lpReserved = NULL;
si.lpDesktop = NULL;
si.lpTitle = NULL;
si.dwX = 0;
si.dwY = 0;
si.dwXSize = 0;
si.dwYSize = 0;
si.dwXCountChars = 0;
si.dwYCountChars = 0;
si.dwFillAttribute = 0;
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
si.cbReserved2 = 0;
si.lpReserved2 = NULL;
si.hStdOutput = hChildStdOut;
si.hStdInput = NULL;
si.hStdError = hChildStdErr;
CreateProcessW(NULL,
L"bash.exe script.sh file_to_process",
NULL,
NULL,
TRUE,
CREATE_NEW_CONSOLE,
NULL,
NULL,
&si,
&pi);
hChildProcess = pi.hProcess;
這裏是如何我試圖讓退出代碼:
WaitForSingleObject(hChildProcess, 0);
DWORD exitCode = 999;
GetExitCodeProcess(hChildProcess, &exitCode);
DWORD lastError = GetLastError();
兩個退出碼和lastError似乎永遠是零而不管應該由腳本返回的退出代碼。
更新
由於cwgem指出,腳本使用exit
退出腳本。我試着將它們全部更改爲return
,exitCode = 1,這不是腳本返回的值。有點谷歌搜索得到我$(exit n)
,這種工作,但我只得到腳本的最終退出代碼(目前爲7測試,但通常爲0)。
因此,舉例來說,我有我的腳本中的以下塊:
if [ `/cygdrive/c/cygwin/bin/find $root -name '*.xml' | grep -c .xml` -eq 0 ] ; then
echo No XMLs present in $root!
$(exit 2)
fi
當我試這條道路我在標準輸出得到「沒有個XML」的消息,如預期,但我不明白2作爲我的退出代碼。相反,我得到了7個,正如我上面提到的那樣,這是腳本中的最終退出語句。
我可以創建一個變量來存儲我的退出碼並返回到了最後,但並不覺得自己是正確的解決方案,因爲我可能會被執行的代碼,我不應該。
我也許應該注意到,我既不筆者也沒有腳本的維護者,我剛剛被要求從我的應用程序運行。
任何命令退出該腳本使用'exit',但這只是給了我一個局部的解決方案,將立即退出。我會更新這個問題。 – phoff 2013-03-11 18:10:39