/ / Как да получите кода за изход от bash скрипт, извикан с winApi CreateProcess? - bash, winapi, visual-c ++, процес, cygwin

Как да получите изходния код от баш скрипт, използван с winApi CreateProcess? - bash, winapi, визуално-c ++, процес, cygwin

Използвам CreateProcess, за да извикам bash скриптСкриптът се изпълнява добре, а аз дори мога да пренасоча stdout и stderr, за да се покаже в моя прозорец. Единственият проблем е, че не мога да получа изходния код на 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();

Както exitCode, така и lastError изглеждат винаги нула, независимо от кода на изход, който трябва да бъде върнат от скрипта.

Актуализация

Както cwgem посочи, скриптът използваше exit , за да излезете от скрипта. Опитах да ги променям return, което exitCode = 1, което не е стойност, върната от скрипта. Малко от Googling ме хвана $(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

Когато тествам този път, получавам съобщение "No XMLs" в stdout, както се очаква, но не получавам 2 като код за излизане.

Мога да създам променлива за съхранение на моя exitcode и да се върне, че в края, но това не се чувствам като правилното решение, тъй като аз "D потенциално да се изпълнява код, че не трябва" т.

Може би трябва да отбележа, че аз не съм нито автор, нито поддръжник на сценария, току-що ме помолиха да го стартирам от моята кандидатура.

Отговори:

2 за отговор № 1

Трябва да проверите потока за изпълнение на скрипта си, тъй като bash ще върне като изходен код връщаната стойност на последната команда за изпълнение, освен ако:

  • Използване на сила exit [returncode]
  • set -e в началото на скрипта, който ще излезе веднага, когато някоя команда излезе с ненулева стойност