win32程序执行控制台命令并重定向输出到文件
2013-08-28 22:10
375 查看
ShellExecute系列函数,可以执行控制台命令,但是无法实现输出重定向。
system函数,可以执行命令,并实现输出重定向,但是无法隐藏控制台窗口。
CreateProcess函数,则既可以执行命令,又可以实现输出重定向,同时不显示控制台窗口。
但是,CreateProcess函数的使用显得有些复杂。
我们可以将他包装一下,让他变得和ShellExecute或system一样好用。
下面的函数my_exec就实现了这种包装。
通过my_exec执行命令,并实现输出重定向非常方便。
例如,执行ping命令,将结果输出到c:\haha.txt中。则按如下方式调用即可。
my_exec(TEXT("ping www.csdn.net"), 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;
}
system函数,可以执行命令,并实现输出重定向,但是无法隐藏控制台窗口。
CreateProcess函数,则既可以执行命令,又可以实现输出重定向,同时不显示控制台窗口。
但是,CreateProcess函数的使用显得有些复杂。
我们可以将他包装一下,让他变得和ShellExecute或system一样好用。
下面的函数my_exec就实现了这种包装。
通过my_exec执行命令,并实现输出重定向非常方便。
例如,执行ping命令,将结果输出到c:\haha.txt中。则按如下方式调用即可。
my_exec(TEXT("ping www.csdn.net"), 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;
}
相关文章推荐
- 如何在Win32窗口程序中发命令打开一个控制台,往里面打印(printf())输出一些数据
- win32控制台程序隐藏和可执行文件图标改变
- 配置maven环境变量cmd控制台提示:mvn不是内部或外部命令,也不是可运行的程序或批处理文件
- 一句话记录:Visual Studio 把需引用的文件自动复制到程序输出窗口中的命令
- [C/C++] VC2012编译的程序在WinXP下报告“指定的可执行文件不是有效的 Win32 应用程序”错误
- java定向输出程序日志(输出到txt文件中)
- 执行系统命令并且将输出写到指定日志文件的shell脚本(1)
- Bat文件执行java命令,报:javac不是内部或外部命令,也不是可运行的程序或批处理文件
- win8.1控制台中执行mvn命令后提示‘cmd’不是内部或外部命令,也不是可执行程序或批处理文件
- mvn -v 报错,’不是内部或外部命令,也不是可执行程序或批处理文件
- 控制台中执行mvn命令后提示‘cmd’不是内部或外部命令,也不是可执行程序或批处理文件
- python中的commands模块,执行出错:'{' 不是内部或外部命令,也不是可运行的程序 或批处理文件。
- linux 程序运行到后台,控制台输出到文件,并能日志切割的方法
- C++调用系统终端执行命令,将输出保存到文件中
- Eclipse中执行Maven命令时控制台输出乱码
- windows环境下使用命令行执行java程序输出文件编码问题
- WIN32程序挂钩SetLastError,输出错误描述到控制台
- 建立一个程序,写2个线程,同时对一个文件里面写入字符串,另外一个程序读取输出在控制台,保证读取的实时性。
- 执行Maven install或Maven test命令时控制台输出乱码的解决办法
- java定向输出程序日志(输出到txt文件中)