C#执行EXE文件与输出消息的提取操作
作者:arenascat 发布时间:2023-02-28 00:08:06
标签:C#,EXE,消息,提取
简介
有时候会需要在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# 调用外部程序,并获取输出和错误信息
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
0
投稿
猜你喜欢
- 一、概述一共两个线程,一个线程生产产品,一个线程消费产品,使用同步代码块方法,同步两个线程。当产品没有时,通知生产者生产,生产者生产后,通知
- 1.选择一个WebService接口作测试假设 WebService url 为 http://ws.webxml.com.cn/WebSe
- SpringBoot对actuator进行关闭management: endpoint: health
- 工厂模式Spring中bean的创建,默认是框架利用反射new出来的bean实例。有时候也会有一些复杂的情况。假设有一个飞机,属性如下,现在
- 1、配置maven环境变量,将maven安装的bin⽬录添加到path路径中(此电脑->属性->高级系统设置->环境变量-
- 一、问题描述在接受 mq 消息的时候,需要做一个重试次数限制,如果超过 maxNum 就发邮件告警,不再重试。 所以我需
- 1、匿名内部类内部类:在一个类的内部定义了另外的类,称为内部类,匿名内部类指的是没有名字的内部类。为了清楚内部类的主要作用,下面首先观察一个
- 我用的是Eclipse打包,但在CMD窗口执行的时候报“ActiveMQ.jar中没有主清单属性”错误。在网上搜了下,这个与MANIFEST
- 前言 在软件开发中,我们通常会遇到一种场景,比如某个请求,会依次经过系统中的很多个模块来处理,如果某个模
- 1、堆的定义①、它是完全二叉树,除了树的最后一层节点不需要是满的,其它的每一层从左到右都是满的。注意下面两种情况,第二种最后一层从左到右中间
- 这篇文章主要介绍了Mybatis一对多关联关系映射实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,
- java 算法之快速排序实现代码摘要: 常用算法之一的快速排序算法的java实现原理:选择一个基准元素,通常选择第一个元素或者最后一个元素,
- 背景今天面试字节算法岗时被问到的问题,让我用C++实现一个softmax函数。softmax是逻辑回归在多分类问题上的推广。大概的公式如下:
- 该项目主要实现mybatisplus、多数据源、lombok、druid的集成主要参考 https://mp.baomidou.com/gu
- 前言关键字Final不仅可以用来修饰变量,而且对类及其方法的继承也有很大的影响,本文将从类与方法两个方面介绍final关键字的功能。Fina
- 本文实例讲述了C#格式化json字符串的方法。分享给大家供大家参考,具体如下:将Json字符串转化成格式化表示的方法: 字符串反序列化为对象
- 一、TPHTable Per Hierarchy (默认,每个层次一个表)每个层次结构共用一个表,类的每一个属性都必须是可空的。1、默认行为
- 项目开发中,经常会遇到定时任务的场景,Spring提供了@Scheduled注解,方便进行定时任务的开发概述要使用@Scheduled注解,
- 什么是面向对象Java语言是一个纯面向对象的语言,面向对象的语言不仅只有Java,包括C++,PHP等面向对象的编程思想简称 OOP(Obj
- 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档前言这两天在项目中使用到Java的导入导出功能,以前对这块有一定了解,但是没