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);
        }

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

(0)

相关推荐

  • C#调用python.exe使用arcpy方式

    背景 环境:ArcGis10.2.2.C#开发程序一直以来以调用Desktop的python环境(32位)来做数据处理分析.但是数据量大时,出现了内存资源不够的情况.因此决定换成使用64位python环境. 遇到问题 C#通过Process.Start()去调用64位python.exe,在Debug模式下毫无问题,但是直接运行exe就报错Process finished with exit code -1073741819 (0xC0000005).指向异常. 分析问题 后来发现是由于arcp

  • c#项目将dll打包到exe中的步骤

    意图: 想将项目用到的两个dll库文件(CryptEnDe.dll和ICSharpCode.SharpZipLib.dll)一同编译进exe中,并编译后仅一个exe程序就可以独立运行不再需要其它文件. 实现: 1.将两个dll库文件作为资源文件添加进项目中: 2.添加功能代码 using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System

  • 浅析C# 索引器(Indexer)

    索引器(Indexer) 允许一个对象可以像数组一样被索引.当您为类定义一个索引器时,该类的行为就会像一个 虚拟数组(virtual array) 一样.您可以使用数组访问运算符([ ])来访问该类的实例. 语法 一维索引器的语法如下: element-type this[int index] { // get 访问器 get { // 返回 index 指定的值 } // set 访问器 set { // 设置 index 指定的值 } } 索引器(Indexer)的用途 索引器的行为的声明在

  • c# 从内存中释放Selenium chromedriver.exe

    背景 我设置了一个c#代码来运行Selenium chromedriver.exe.在运行结束时,我有browser.close()来关闭实例.(browser = webdriver.Chrome())我相信它应该从内存中释放chromedriver.exe(我在Windows 7上).但是每次运行后,内存中仍有一个chromedriver.exe实例. 问题窥探 从理论上讲,调用browser.Quit将关闭所有浏览器选项卡并终止进程. 但是,在我的情况下,我无法做到这一点 - 因为我并行运

  • c# 将Minio.exe注册成windows服务

    minio 注册成windows 服务的工具开发 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Diagnostics; using System.Drawing; using System.IO; using System.Linq; using System.Management.Automation; using Sys

  • C# 调用exe传参,并获取打印值的实例

    调用方法: string baseName = System.IO.Directory.GetCurrentDirectory(); // baseName+"/" // string fileName = @"C:\Users\59930\Desktop\20170605\WindowsFormsApp1\WindowsFormsApp1\WindowsFormsApp1\bin\x86\Debug\WindowsFormsApp1.exe"; string fi

  • c# 使用handle.exe解决程序更新文件被占用的问题

    我公司最近升级程序经常报出更新失败问题,究其原因,原来是更新时,他们可能又打开了正在被更新的文件,导致更新文件时,文件被其它进程占用,无法正常更新而报错,为了解决这个问题,我花了一周时间查询多方资料及研究,终于找到了一个查询进程的利器:handle.exe,下载地址:https://technet.microsoft.com/en-us/sysinternals/bb896655.aspx,我是通过它来找到被占用的进程,然后KILL掉占用进程,最后再来更新,这样就完美的解决了更新时文件被占用报错

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

    简介 有时候会需要在c#特别是WPF环境下调用其他的程序,这类型的程序以命令行为执行环境,这里就说明下如何调用exe并传递参数 一般有两种方法 一种是直接调用exe程序并执行,另一种是调用cmd.exe然后通过输入的方式来执行指定的程序,前者虽然直接但是有时候不能读出输出的信息 因此这里我推荐使用第二个方法,使用异步的方式来创建cmd.exe进程,然后调用我们所需要的程序 1.声明和初始化一个Process类实例 //进程的名称 string fileName = "cmd.exe";

  • 利用wscript执行文件[包括可执行exe文件]vbs脚本

    昨天下载并且安装了Updater Application Block后,需要执行一个Deploy.vbs的文件,鄙人才疏学浅,这个小问题竟然也花费了我不少心机. 现在把结论共享一下. 首先,我的vbs文件关联已经被"豪杰"夺取了.我双击Deploy.vbs就会打开豪杰,比较郁闷.但是我用了打开方式,试了浏览器.cmd,都无济于事. 今天,我想到这个问题后,就有想法去Microsoft的News Group上去问一问.然后又去了CSDN的全文检索.果然很争气,我的关键字只是vbs,执行,

  • 详解如何将JAVA程序制作成可以直接执行的exe文件

    突然心血来潮,想自己做个小程序玩玩,但是怎么把他做成一个exe文件,让大家能够更好的理解和使用呢,百度了一下,说是需要exe4j来生成,但是看了很多关于exe4j将java程序生成exe文件的教程,觉着都不是自己想要的结果,还是自己综合一下,写篇文章记录一下. 下载和安装的步骤我就略过了,直接说重点. 一 : 将写好的java程序打成jar包,如下图: 1: . 2: 3: 4: 5:此处填写MANIFEST.MF文件路径,MANIFEST.MF手动创建后放在下项目路径下即可 MANIFEST.

  • 解决python中os.system调用exe文件的问题

    前一段时间导师叫我写一个批处理的小程序,就是循环修改辐射传输模型软件MODTRAN的输入参数,然后运行MODTRAN软件进行计算,输出 需要的结果.我这里用的是python写的小程序,那就需要考虑用python调用MODTRAN的exe文件运行,查了一些资料可以用os.system命令来 执行exe文件,说起来直接调用就行了嘛,对吧,但是说起来简单,还是会遇到一些莫名其妙的问题,下面我来说说我遇到的问题. 先给大家介绍一下MODTRAN这个软件运行的一个过程. 这个软件里的东西如下图所示: 简单

  • 使用Pyinstaller打包exe文件详细图文教程

    目录 前言 场景说明 pyinstaller安装 打包参数 打包问题解决方法汇总 总结 前言 在业务场景中, 经常需要Python开发一些小程序/脚本/GUI界面,交付给一些小白或未安装Python 的小伙伴们使用.噔噔蹬蹬 pyinstaller 闪亮登场 场景说明 使用Pyinstaller将Python脚本或者项目打包,生成可执行的.exe文件. Pyinstaller是一个很不错的免费打包工具,支持Windows,Linux和MacOS,完美支持32位和64位系统. 除了Pyinstal

  • Python制作exe文件简单流程

    一:什么是exe? exe是Windows环境中的文件扩展名之一,它是一个可执行文件,虽然扩展程序在一般情况下是隐藏的,但是我们可以通过取消选中资源管理器文件夹的高级设置中的"不显示已注册的扩展名"来显示它. 可执行文件意味着它是一个可以由其自身执行的文件,而不是其他程序.例如,在Python程序中要执行它,在命令提示符下按如下所示编写,其中hello.py是文件名. python hello.py 如果将其转换为可执行文件,即exe文件,则可以通过在命令提示符下按如下方式编写,也可以

  • 史上最详细的Python打包成exe文件教程

    打包成exe文件可以让python代码在没有python环境的条件下,依然能够运行,实在是码农们写追女朋友表白.情人节浪漫的必需品! 1.使用豆瓣镜像源下载: pyinstaller 有需要了解如何使用国内镜像的小伙伴可以滴滴到此: 国内镜像源详细使用教程! https://blog.csdn.net/xtreallydance/article/details/112596963 在python终端或者cmd中输入此命令: pip install pyinstaller -i https://p

  • Python将py文件编译为exe文件

    使用PyCharm工具写好的Python程序脚本,怎么将.py文件编译为可执行的.exe文件 前提是已经安装了Python环境. 第一步:在PyCharm内下载安装pyinstalle库或使用CMD安装 PyCharm内安装: File->Settings->Project Interpreter->添加相应的包 或者使用CMD安装,提示安装成功即可pyinstaller pip install pyinstaller 第二步:进入pyinstaller .exe所在的文件夹内,进入CM

  • java 启动exe程序,传递参数和获取参数操作

    1.java中启动exe程序 ,并添加传参 String[] cmd = {"hh.exe","12315"}; Process process = null; try { ProcessBuilder pb = new ProcessBuilder(); pb.command(cmd); process=pb.start(); } catch (Exception e) { e.printStackTrace(); }finally { if (process !

  • java 使用idea将工程打成jar并创建成exe文件类型执行的方法详解

    第一部分: 使用idea 打包工程jar 1.准备好一份 开发好的 可执行的 含有main方法的 工程. 例如:我随便写的main方法 public static void main(String[] args) throws IOException { Properties properties = System.getProperties(); String osName = properties.getProperty("os.name"); System.out.println

随机推荐