将命令行进程的标准输出重定向到文件
Posted
技术标签:
【中文标题】将命令行进程的标准输出重定向到文件【英文标题】:Redirecting Stdout of a commandline process to a file 【发布时间】:2013-08-30 10:41:48 【问题描述】:我有一个 MFC 应用程序,它通过 CreateProcess 函数向 cmd 发送命令。我想将标准输出放入日志文件。代码是这样的
void CMainFrame::OnCompile( CString cmd )
CWaitCursor cursor;
SECURITY_ATTRIBUTES sec;
ZeroMemory( &sec, sizeof(sec) );
sec.nLength = sizeof(SECURITY_ATTRIBUTES);
sec.lpSecurityDescriptor = NULL;
sec.bInheritHandle = TRUE;
HANDLE hstdoutf = CreateFile("e:\\user_stdout.txt",GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,&sec,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
STARTUPINFO siStartupInfo;
PROCESS_INFORMATION piProcessInfo;
memset(&siStartupInfo, 0, sizeof(siStartupInfo));
memset(&piProcessInfo, 0, sizeof(piProcessInfo));
siStartupInfo.cb = sizeof(siStartupInfo);
siStartupInfo.dwFlags = STARTF_USESHOWWINDOW ;
siStartupInfo.wShowWindow = SW_HIDE;
if (hstdoutf!=INVALID_HANDLE_VALUE)
siStartupInfo.hStdOutput=hstdoutf;
// Wait up to 100 seconds for the compilation process to finish
if (!::CreateProcess(0, (char*)(cmd.GetString()), 0, 0, false,0, 0, 0,
&siStartupInfo, &piProcessInfo) ||
(WaitForSingleObject(piProcessInfo.hProcess, 100000) != WAIT_OBJECT_0))
MessageBox("Fail to execute command","Test",MB_ICONERROR);
else
CloseHandle(hstdoutf);
但代码运行不正常。仅创建一个空白文件。 我做错了什么?请帮忙。
【问题讨论】:
【参考方案1】:您忘记在 siStartupInfo.dwFlags 中指定 STARTF_USESTDHANDLES 标志。
改变
startupInfo.dwFlags = STARTF_USESHOWWINDOW ;
到
startupInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES ;
改变
CreateProcess(0, (char*)(cmd.GetString()), 0, 0, false, 0, 0, 0,
&siStartupInfo, &piProcessInfo)
到
CreateProcess(0, (char*)(cmd.GetString()), 0, 0, true, 0, 0, 0,
&siStartupInfo, &piProcessInfo)
我建议你阅读STARTUPINFO documentation 的STARTF_USESTDHANDLES 部分,有很多信息。
顺便说一句,您还应该添加
CloseProcess(piProcessInfo.hProcess)
在最后。
【讨论】:
以上是关于将命令行进程的标准输出重定向到文件的主要内容,如果未能解决你的问题,请参考以下文章