如何在 windows c++ 中的 cmd 中的 运行 命令后获取退出代码

How to get exit code after running command in cmd in windows c++

我在 cmd 中使用 Createprocess 到 运行 命令,我正在尝试使用 GetExitCodeProcess() 获取该特定命令执行的退出代码。

如果命令 window 打开并且我尝试 GetExitCodeProcess() 然后我总是得到 259(STILL_ACTIVE) return 代码。如果我尝试使用 TerminateProcess() 终止进程,那么我会得到退出代码,即我发送给终止进程的值。

下面是我的代码:

    STARTUPINFO si;   
    ZeroMemory(&si,sizeof(STARTUPINFO));
    si.cb = sizeof(si);

    PROCESS_INFORMATION pi;
    ZeroMemory( &pi, sizeof(pi) );

    BOOL b =  CreateProcess("C:\Windows\System32\cmd.exe","/k dir",NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);

    TerminateProcess(pi.hProcess,1);

    DWORD dwExitCode = 0;
    ::GetExitCodeProcess(pi.hProcess, &dwExitCode);

当我将 /k dir 作为命令传递时,我应该得到非零错误代码;如果我传递 /k dirancbdf(任何不存在的命令),我应该得到零错误代码。

使用 Terminateprocess 的另一个原因是我想 hide/Show 命令提示符基于该命令的 success/failure。

您正在将选项 /k 传递给 cmd.exe,这意味着您希望 shell 在执行命令 dir 后保持活动状态。这样做,进程运行命令将永远不会结束,你在查询GetExitCodeProcess()时总是得到STILL_ACTIVE(意味着进程仍然是运行)。

如果你想要dir命令的退出代码,你应该使用选项/c代替(这样cmd.exe在执行命令dir之后结束)。此外,您应该在查询GetExitCodeProcess()之前等待进程结束使用WaitForSingleObject(),因为CreateProcess()会在创建进程后立即return(它不会等待进程结束)。在这种情况下无需调用 TerminateProcess()dir 命令 return 状态将从 GetExitCodeProcess().

获得
BOOL b =  CreateProcess("C:\Windows\System32\cmd.exe","/c dir",NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);
WaitForSingleObject( pi.hProcess, INFINITE );  // wait for process to end
DWORD dwExitCode = 0;
::GetExitCodeProcess(pi.hProcess, &dwExitCode);

如果您希望控制台在发生错误时保持打开状态,您可以使用以下语法:

CreateProcessA("C:\Windows\System32\cmd.exe","/c dir || pause && exit 1",NULL,NULL,TRUE,CREATE_NEW_CONSOLE,NULL,NULL,&si,&pi);

其中 || 确保仅当 dir 命令失败时才执行 pause 命令,并且 && 确保输出代码 1 以防万一出现这样的错误。