ShellExecute系列函数,可以执行控制台命令,但是无法实现输出重定向。
system函数,可以执行命令,并实现输出重定向,但是无法隐藏控制台窗口。
CreateProcess函数,则既可以执行命令,又可以实现输出重定向,同时不显示控制台窗口。
但是,CreateProcess函数的使用显得有些复杂。
我们可以将他包装一下,让他变得和ShellExecute或system一样好用。
下面的函数my_exec就实现了这种包装。
通过my_exec执行命令,并实现输出重定向非常方便。
例如,执行ping命令,将结果输出到c:\haha.txt中。则按如下方式调用即可。
my_exec(TEXT("ping www.youkuaiyun.com"), TEXT("c:\\haha.txt"), -1);
再如,执行dos命令dir,并将结果输出到c:\fff.txt中。则按如下方式调用即可。
my_exec(TEXT("cmd.exe /c dir d:") , TEXT("c:\\fff.txt"), -1);
好了,函数my_exec的代码实现如下。
int my_exec(TCHAR *cmd, TCHAR *output_file, int wait_time_sec)
{
PROCESS_INFORMATION pi;
STARTUPINFO si;
BOOL ret = FALSE;
DWORD flags = CREATE_NO_WINDOW;
HANDLE h;
SECURITY_ATTRIBUTES sa;
sa.nLength = sizeof(sa);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
h = CreateFile(output_file,
FILE_APPEND_DATA,
FILE_SHARE_WRITE | FILE_SHARE_READ,
&sa,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL );
ZeroMemory( &pi, sizeof(PROCESS_INFORMATION) );
ZeroMemory( &si, sizeof(STARTUPINFO) );
si.cb = sizeof(STARTUPINFO);
si.dwFlags |= STARTF_USESTDHANDLES;
si.wShowWindow =SW_HIDE;
si.hStdInput = NULL;
si.hStdError = NULL;
si.hStdOutput = h;
ret = CreateProcess(NULL, cmd, NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi);
WaitForSingleObject(pi.hProcess, -1==wait_time_sec?INFINITE:wait_time_sec*1000 );
CloseHandle(h);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
return ret;
}
本文介绍了一种在Windows环境下执行命令并实现输出重定向的方法。通过自定义函数my_exec,可以轻松地将命令输出保存到文件中,同时避免控制台窗口的显示。文章提供了具体的代码实现和示例。
522

被折叠的 条评论
为什么被折叠?



