2013-03-09 34 views
1

我正在使用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個,正如我上面提到的那樣,這是腳本中的最終退出語句。

我可以創建一個變量來存儲我的退出碼並返回到了最後,但並不覺得自己是正確的解決方案,因爲我可能會被執行的代碼,我不應該。

我也許應該注意到,我既不筆者也沒有腳本的維護者,我剛剛被要求從我的應用程序運行。

回答

2

你應該檢查你的腳本的執行流程,如bash將除非您返回退出代碼的最後運行命令的返回值:在的開始

  • 退出強制使用exit [returncode]
  • set -e腳本,當一個非零值
+0

任何命令退出該腳本使用'exit',但這只是給了我一個局部的解決方案,將立即退出。我會更新這個問題。 – phoff 2013-03-11 18:10:39

相關問題