windows下C与C++执行cmd命令并实时获取输出
1. 前言
在windows下一般会使用系统的cmd命令或者其他现成的一些命令行可执行程序来完成一些操作,比如:调用ping命令来测试网络是否畅通、调用ffmpeg命令进行视频转码等等。为了能在软件界面上有更好的交互输出,都需要将命令执行的过程拿到,进行处理,然后在界面上进行显示,让用户知道程序正在正常运行,下面就介绍几种输出的获取方式。
当前开发环境: win10 64位 IDE-MSVC2017
2. 使用_popen执行进程
通过_popen打开进程进行执行,通过fgets获取进程的输出。
#include <stdio.h>
#include <string.h>int run_cmd(const char * cmd)
{char MsgBuff[1024];int MsgLen=1020;FILE * fp;if (cmd == NULL){return -1;}if ((fp = _popen(cmd, "r")) == NULL){return -2;}else{memset(MsgBuff, 0, MsgLen);//读取命令执行过程中的输出while (fgets(MsgBuff, MsgLen, fp) != NULL){printf("MsgBuff: %s\n", MsgBuff);}//关闭执行的进程if(_pclose(fp) == -1){return -3;}}return 0;
}int main()
{//const char *cmd = "ffmpeg -i D:\\123.mp4 -vf reverse D:\\out\\out1.mp4";const char *cmd = "ping www.baidu.com";int ret = 0;ret = run_cmd(cmd);printf("命令执行结果:%d\r\n",ret);getchar();return 0;
}
3. CreateProcess重定向输出到文件
下面使用CreateProcess调用子进程运行,将输出保存在文件中,阻塞等待进程执行完毕。
int my_CreateProcess()
{SECURITY_ATTRIBUTES sa;sa.nLength = sizeof(sa);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle = TRUE;_unlink("D:/out/output.log");HANDLE h = CreateFile((L"D:/out/output.log"),FILE_APPEND_DATA,FILE_SHARE_WRITE | FILE_SHARE_READ,&sa,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);PROCESS_INFORMATION pi;STARTUPINFO si;BOOL ret = FALSE;DWORD flags = CREATE_NO_WINDOW;ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));ZeroMemory(&si, sizeof(STARTUPINFO));si.cb = sizeof(STARTUPINFO);si.dwFlags |= STARTF_USESTDHANDLES;si.hStdInput = NULL;si.hStdError = h;si.hStdOutput = h;TCHAR cmd[] = TEXT("ping www.baidu.com");ret = CreateProcess(NULL, cmd, NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi);if (ret){WaitForSingleObject(pi.hProcess, INFINITE);printf("执行成功....\n");CloseHandle(pi.hProcess);CloseHandle(pi.hThread);//关闭文件CloseHandle(h);return 0;}//关闭文件CloseHandle(h);printf("执行失败....\n");return -1;
}
4. CreateProcess重定向输出到管道
为了能实时获取CreateProcess打开进程运行时实时输出的结果,可以将CreateProcess的输出重定向到管道文件,CreateProcess将数据写到管道的写端,在父进程里再从管道的读端就能实时读取数据。
int my_CreateProcess()
{BOOL run_pipe;PROCESS_INFORMATION pi;STARTUPINFO si;BOOL ret = FALSE;DWORD flags = CREATE_NO_WINDOW;_unlink("D:/out/output.log");char pBuffer[210];SECURITY_ATTRIBUTES sa;sa.nLength = sizeof(SECURITY_ATTRIBUTES);sa.lpSecurityDescriptor = NULL;sa.bInheritHandle = TRUE;HANDLE hReadPipe, hWritePipe;run_pipe=CreatePipe(&hReadPipe, &hWritePipe, &sa, 0);printf("run_pipe=%d\n", run_pipe);ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));ZeroMemory(&si, sizeof(STARTUPINFO));si.cb = sizeof(STARTUPINFO);si.dwFlags |= STARTF_USESTDHANDLES; si.hStdInput = NULL;si.hStdError = hWritePipe;si.hStdOutput = hWritePipe;TCHAR cmd[] = TEXT("ffmpeg -i D:\\123.mp4 -vf reverse D:\\out\\out1.mp4");ret = CreateProcess(NULL, cmd, NULL, NULL, TRUE, flags, NULL, NULL, &si, &pi);if (ret){while (true){DWORD ExitCode = 0;//判断进程是否执行结束GetExitCodeProcess(pi.hProcess, &ExitCode);if (ExitCode == STILL_ACTIVE) //正在运行{DWORD RSize=0;BOOL run_s=0;run_s =ReadFile(hReadPipe, pBuffer,200,&RSize,NULL);pBuffer[RSize] = '\0';printf("返回结果:%d,%d,%s\n", run_s, RSize, pBuffer);}else //结束{printf("执行完毕...\n");break;}}//WaitForSingleObject(pi.hProcess, INFINITE);printf("执行成功....\n");CloseHandle(pi.hProcess);CloseHandle(pi.hThread);return 0;}printf("执行失败....\n");return -1;
}
windows下C与C++执行cmd命令并实时获取输出相关推荐
- CreateProcess 执行CMD命令,并重定向输出
1. 参考网址:http://www.cnblogs.com/cnarg/archive/2011/02/20/1959292.html 1 function TfrmMain.ExecDosCmd ...
- SQL下三种执行CMD命令的方法
SQL下三种执行CMD命令的方法: 先删除7.18号日志: (1)exec master.dbo.xp_cmdshell 'del C:/winnt/system32/logfiles/W3SVC5/ ...
- 【开发环境】Java 文件生成 Windows 系统 .bat 批处理文件并自动执行 ( 输出 GB2312 格式处理中文乱码 | \r\n换行 | Runtime 执行 Cmd 命令 )
文章目录 Java 文件生成 Windows 系统 .bat 批处理文件并自动执行 1.生成 bat 脚本注意事项 2.Java 执行 Cmd 命令 3.完整代码示例 4.执行结果 Java 文件生成 ...
- windows 远程执行 cmd 命令的 9 种方法
一.远程执行命令方式及对应端口: IPC$+AT 445 PSEXEC 445 WMI 135 Winrm 5985(HTTP)&5986(HTTPS) 二.9种远程执行cmd ...
- linux远程windows执行cmd,Linux服务器远程连接window服务器并执行cmd命令
前段时间,要给一个分布式调度系统写一个运维脚本,这个分布式调度系统部分子系统部署在window服务器上,这个时候就要想办法用Linux远程来连接window服务器,并执行cmd命令.下面是我的解决方法 ...
- java远程执行cmd命令,windows远程执行cmd命令的9种方法
一.远程执行命令方式及对应端口: IPC$+AT 445 PSEXEC445 WMI135 Winrm5985(HTTP)&5986(HTTPS) 二.9种远程执行cmd命令的方法: ...
- 写一个打开cmd窗口并执行cmd命令的Windows脚本(.bat文件)
可以执行cmd命令的.bat脚本 最近因为工作,每天早上需要在Windows上启动reids.zookeeper.tomcat几个程序,时间一长就感觉有点繁琐,于是心血来潮想写个脚本来一键解决问题,经 ...
- windows python 执行cmd 命令启动浏览器跳转到指定网页
windows python 执行cmd 命令启动浏览器跳转到指定网页 1.系统默认浏览器打开百度 cmd命令 # 有没有http都是可以的 start www.baidu.com python im ...
- python 命令-python执行cmd命令
我们在做手机端自动化的时候有时候可能会遇到需要执行cmd命令完成用例,我们一起学习下,通过python脚本执行cmd命令 cmd是什么 cmd是command的缩写.即命令提示行(CMD),是在OS ...
最新文章
- 基于模型的强化学习比无模型的强化学习更好?错!
- 在Gridview控件中根据Field Name来取得对应列索引
- Android播放器自定义,android surfaceView+mediaPlayer 自定义视频播放器
- 分支合并 Fork-Join 框架
- Web前端面试指导(十八):用纯CSS创建一个三角形的原理是什么?
- 模式对话框与非模式对话框的区别2
- 项目落地才是硬道理!TensorFlow 2 牛了
- android 开启子线程执行for循环_C++11之多线程 - Part2 Joining和Detaching的使用
- 使用vue写扫雷游戏
- 2019ASC世界大学生超算竞赛预赛结果出炉:20校晋级,北航第一
- CCF CSP 201604-1 折点计数
- 七牛底层架构再完善 让服务从单一走向多元
- mongodb update ()命令
- Python编程 | 统计新浪微博热门话题
- Something about 博弈~(updating...)
- Burp Suite 实战指南
- Vue中时间日期格式化
- 测试路由器信号软件,无线信号测试环境及测试方法介绍
- 全球100位最佳工程师,开发人员,编码人员和企业家,可以在线关注他们的github,推特,网站等
- 机器学习从入门到创业手记-初识sklearn
热门文章
- 【行研报告】2021年中国团餐行业研究分析报告—附下载
- 自上而下的显著性检测有哪些_2020东莞埋地供水管漏水检测哪里有快捷方便
- linux终端文字看不清,Linux字体模糊该怎么解决? Linux让字体清晰的教程
- 牛顿迭代法实现平方根函数sqrt
- 什么是cs模式_CS的完整形式是什么?
- 中企动力助力巨通装饰 让家装行业再无痛点
- proteus8如何画封装_Proteus-元件封装图形(各种封装)
- Kafka消费组(consumer group)(转)
- Matlab:创建复数
- CSS3动画基础学习