我正在使用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