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命令并实时获取输出相关推荐

  1. CreateProcess 执行CMD命令,并重定向输出

    1. 参考网址:http://www.cnblogs.com/cnarg/archive/2011/02/20/1959292.html 1 function TfrmMain.ExecDosCmd ...

  2. SQL下三种执行CMD命令的方法

    SQL下三种执行CMD命令的方法: 先删除7.18号日志: (1)exec master.dbo.xp_cmdshell 'del C:/winnt/system32/logfiles/W3SVC5/ ...

  3. 【开发环境】Java 文件生成 Windows 系统 .bat 批处理文件并自动执行 ( 输出 GB2312 格式处理中文乱码 | \r\n换行 | Runtime 执行 Cmd 命令 )

    文章目录 Java 文件生成 Windows 系统 .bat 批处理文件并自动执行 1.生成 bat 脚本注意事项 2.Java 执行 Cmd 命令 3.完整代码示例 4.执行结果 Java 文件生成 ...

  4. windows 远程执行 cmd 命令的 9 种方法

    一.远程执行命令方式及对应端口:  IPC$+AT 445  PSEXEC 445  WMI 135  Winrm 5985(HTTP)&5986(HTTPS) 二.9种远程执行cmd ...

  5. linux远程windows执行cmd,Linux服务器远程连接window服务器并执行cmd命令

    前段时间,要给一个分布式调度系统写一个运维脚本,这个分布式调度系统部分子系统部署在window服务器上,这个时候就要想办法用Linux远程来连接window服务器,并执行cmd命令.下面是我的解决方法 ...

  6. java远程执行cmd命令,windows远程执行cmd命令的9种方法

    一.远程执行命令方式及对应端口:  IPC$+AT 445 PSEXEC445 WMI135 Winrm5985(HTTP)&5986(HTTPS) 二.9种远程执行cmd命令的方法: ...

  7. 写一个打开cmd窗口并执行cmd命令的Windows脚本(.bat文件)

    可以执行cmd命令的.bat脚本 最近因为工作,每天早上需要在Windows上启动reids.zookeeper.tomcat几个程序,时间一长就感觉有点繁琐,于是心血来潮想写个脚本来一键解决问题,经 ...

  8. windows python 执行cmd 命令启动浏览器跳转到指定网页

    windows python 执行cmd 命令启动浏览器跳转到指定网页 1.系统默认浏览器打开百度 cmd命令 # 有没有http都是可以的 start www.baidu.com python im ...

  9. python 命令-python执行cmd命令

    我们在做手机端自动化的时候有时候可能会遇到需要执行cmd命令完成用例,我们一起学习下,通过python脚本执行cmd命令 cmd是什么 cmd是command的缩写.即命令提示行(CMD),是在OS ...

最新文章

  1. 基于模型的强化学习比无模型的强化学习更好?错!
  2. 在Gridview控件中根据Field Name来取得对应列索引
  3. Android播放器自定义,android surfaceView+mediaPlayer 自定义视频播放器
  4. 分支合并 Fork-Join 框架
  5. Web前端面试指导(十八):用纯CSS创建一个三角形的原理是什么?
  6. 模式对话框与非模式对话框的区别2
  7. 项目落地才是硬道理!TensorFlow 2 牛了
  8. android 开启子线程执行for循环_C++11之多线程 - Part2 Joining和Detaching的使用
  9. 使用vue写扫雷游戏
  10. 2019ASC世界大学生超算竞赛预赛结果出炉:20校晋级,北航第一
  11. CCF CSP 201604-1 折点计数
  12. 七牛底层架构再完善 让服务从单一走向多元
  13. mongodb update ()命令
  14. Python编程 | 统计新浪微博热门话题
  15. Something about 博弈~(updating...)
  16. Burp Suite 实战指南
  17. Vue中时间日期格式化
  18. 测试路由器信号软件,无线信号测试环境及测试方法介绍
  19. 全球100位最佳工程师,开发人员,编码人员和企业家,可以在线关注他们的github,推特,网站等
  20. 机器学习从入门到创业手记-初识sklearn

热门文章

  1. 【行研报告】2021年中国团餐行业研究分析报告—附下载
  2. 自上而下的显著性检测有哪些_2020东莞埋地供水管漏水检测哪里有快捷方便
  3. linux终端文字看不清,Linux字体模糊该怎么解决? Linux让字体清晰的教程
  4. 牛顿迭代法实现平方根函数sqrt
  5. 什么是cs模式_CS的完整形式是什么?
  6. 中企动力助力巨通装饰 让家装行业再无痛点
  7. proteus8如何画封装_Proteus-元件封装图形(各种封装)
  8. Kafka消费组(consumer group)(转)
  9. Matlab:创建复数
  10. CSS3动画基础学习