2013-03-09 44 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