C#执行EXE文件与输出消息的提取操作

作者:arenascat 时间:2023-02-28 00:08:06 

简介

有时候会需要在c#特别是WPF环境下调用其他的程序,这类型的程序以命令行为执行环境,这里就说明下如何调用exe并传递参数

一般有两种方法

一种是直接调用exe程序并执行,另一种是调用cmd.exe然后通过输入的方式来执行指定的程序,前者虽然直接但是有时候不能读出输出的信息

因此这里我推荐使用第二个方法,使用异步的方式来创建cmd.exe进程,然后调用我们所需要的程序

1.声明和初始化一个Process类实例


//进程的名称
string fileName = "cmd.exe";
//测试参数
string para = @"avrdude\avrdude.exe -C avrdude\avrdude.conf -v -p atmega32u4 -c avr109 -P " + portname+" -b 57600 -D -U flash:w:node.hex:i";
//声明
Process p = new Process();

2.填写相关的参数

这里所需的参数主要是将输入和输出重新定向到Process类的内存中,这样我们就可以通过Process类实例来操作cmd的输入,同时也可以读出命令行的输出


p.StartInfo.CreateNoWindow = true;         // 不创建新窗口    
p.StartInfo.UseShellExecute = false;       //不启用shell启动进程  
p.StartInfo.RedirectStandardInput = true;  // 重定向输入    
p.StartInfo.RedirectStandardOutput = true; // 重定向标准输出    
p.StartInfo.RedirectStandardError = true;  // 重定向错误输出  
p.StartInfo.FileName = fileName;

3.执行


p.Start();

4.模拟输入并结束输入

模拟输入的部分已经包括了我们需要调用的程序以及参数,可以事先用cmd来试试看,这里的


p.StandardInput.WriteLine(para + "&exit");
p.StandardInput.AutoFlush = true;
p.StandardInput.Close();

5.获取输出

这一部分可以获取在cmd中执行的程序在执行完成后所输出的信息,WaitForExit可以填写参数也可以不写


p.StandardOutput.ReadToEnd();
string output = p.StandardError.ReadToEnd();
//  p.OutputDataReceived += new DataReceivedEventHandler(processOutputDataReceived);
p.WaitForExit();//参数单位毫秒,在指定时间内没有执行完则强制结束,不填写则无限等待
p.Close();
AddInfo(output);

这里我注释掉的部分代码是设置收到输出之后就跳转的函数,但经过测试发现和我前文所述的第一种方式一样不可行,很多的程序是用错误输出来输出信息。因此弃用

这样就可以完成消息的处理了,具体的结合WPF的用法(如下图)我将在后继进行说明

C#执行EXE文件与输出消息的提取操作

补充:C# 调用外部程序,并获取输出和错误信息

1. 同步模式


public void exec(string exePath, string parameters)
       {
           System.Diagnostics.ProcessStartInfo psi =
  new System.Diagnostics.ProcessStartInfo();
           psi.RedirectStandardOutput = true;
           psi.RedirectStandardError = true;
           psi.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
           psi.UseShellExecute = false;
           psi.FileName = exePath;
           psi.Arguments = parameters;
           System.Diagnostics.Process process = System.Diagnostics.Process.Start(psi);
           System.IO.StreamReader outputStreamReader = process.StandardOutput;
           System.IO.StreamReader errStreamReader = process.StandardError;
           process.WaitForExit(2000);
           if (process.HasExited)
           {
               string output = outputStreamReader.ReadToEnd();
               string error = errStreamReader.ReadToEnd();
               MessageBox.Show(output);
               MessageBox.Show(error);
           }

}

2.异步模式


public void exec(string exePath, string parameters)
       {
           Process process = new System.Diagnostics.Process();
           process.StartInfo.FileName = exePath;
           process.StartInfo.Arguments = parameters;
           process.StartInfo.UseShellExecute = false;
           process.StartInfo.CreateNoWindow = true;
           process.StartInfo.RedirectStandardOutput = true;
           process.Start();
           process.BeginOutputReadLine();
           process.OutputDataReceived += new DataReceivedEventHandler(processOutputDataReceived);
       }

private void processOutputDataReceived(object sender, DataReceivedEventArgs e)
       {
           MessageBox.Show(e.Data);
       }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。

来源:https://blog.csdn.net/u012388993/article/details/82892291

标签:C#,EXE,消息,提取
0
投稿

猜你喜欢

  • java实现新浪微博Oauth接口发送图片和文字的方法

    2023-11-29 01:43:04
  • mybatis-plus的批量新增/批量更新以及问题

    2022-10-28 04:44:16
  • 汉字转拼音缩写示例代码(Silverlight和.NET 将汉字转换成为拼音)

    2023-01-18 10:29:45
  • Android打包上传AAR文件到Maven仓库的示例

    2023-07-02 15:14:14
  • 详解SpringBoot中的统一功能处理的实现

    2022-07-06 12:14:49
  • Android利用Badge组件实现未读消息小红点

    2021-11-09 10:30:33
  • 一篇文章带你Java Spring开发入门

    2021-06-25 10:04:15
  • 解决IDEA中 Ctrl+ALT+V这个快捷键无法使用的情况

    2022-02-27 07:51:36
  • 妙解Java中的回调机制(CallBack)

    2022-07-15 15:25:31
  • Mybatis源码解析之事务管理

    2023-01-14 10:59:34
  • Java日常练习题,每天进步一点点(52)

    2023-03-31 11:23:46
  • Swagger2匹配多个controller代码实例

    2022-07-31 03:42:24
  • Jackson中json格式的字符串与对象的互相转换方式

    2022-01-29 03:31:07
  • java中找不到符号的解决方案

    2023-09-01 17:50:11
  • C#算法之整数反转

    2021-09-24 18:36:49
  • Unity脚本自动添加头部注释的全过程

    2021-06-09 08:38:20
  • Java的外部类为什么不能使用private和protected进行修饰的讲解

    2023-06-29 00:45:57
  • Kotlin 高阶函数与Lambda表达式示例详解

    2021-06-18 08:58:15
  • 详解Android.activity销毁流程的工作原理

    2021-11-17 19:12:35
  • Android自定义View实现九宫格图形解锁(Kotlin版)

    2022-04-09 11:10:50
  • asp之家 软件编程 m.aspxhome.com