gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 05:27:32 24 4
gpt4 key购买 nike

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

如果命令窗口打开并且我尝试 GetExitCodeProcess() 然后我总是得到 259(STILL_ACTIVE) 返回代码。如果我尝试使用 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 的另一个原因是我想根据该命令的成功/失败隐藏/显示命令提示符。

最佳答案

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

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

关于c++ - 如何在 Windows C++ 的 cmd 中运行命令后获取退出代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40235266/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com