如何在 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 以防万一出现这样的错误。
我在 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 以防万一出现这样的错误。