如何获取 Process.Start 打开进程的输出结果?

咨询区

  • stighy

我想用 C# 通过控制台开启一个外部程序,理论上我就可以让程序和这个外部程序实现交互,但现在我遇到了两个问题。

  1. 如何获取控制台上的输出呢?我想将结果写到我的 textbox 上。

  2. 如何获取数值型的值让我可以展示进度条。

回答区

  • Ferruccio

可以实例化一个 Process 并赋值 StartInfo 属性,比如下面这样:

var proc = new Process 
{StartInfo = new ProcessStartInfo{FileName = "program.exe",Arguments = "command line arguments to your executable",UseShellExecute = false,RedirectStandardOutput = true,CreateNoWindow = true}
};

然后就可以把进程启动起来并从控制台中读取结果。

proc.Start();
while (!proc.StandardOutput.EndOfStream)
{string line = proc.StandardOutput.ReadLine();// do something with line
}

你可以使用 int.Parse()int.TryParse() 方法将 string 转成 numeric 值,建议用 try 方式,这样可以处理非 numeric 时的逻辑。

  • Tyrrrz

System.Diagnostics.Process 属于比较底层的东西,我在项目中并不待见它,换言之我更愿意使用 CliWrap 这样的开源工具包,它提供了很多实用的功能,比如: 管道操作,缓存,流式处理,参考如下的例子:

  1. 启动控制台。

using CliWrap;var result = await Cli.Wrap("path/to/exe").WithArguments("--foo bar").WithWorkingDirectory("work/dir/path").ExecuteAsync();// Result contains:
// -- result.ExitCode        (int)
// -- result.StartTime       (DateTimeOffset)
// -- result.ExitTime        (DateTimeOffset)
// -- result.RunTime         (TimeSpan)
  1. 启动控制台接收事件流

using CliWrap;
using CliWrap.EventStream;var cmd = Cli.Wrap("foo").WithArguments("bar");await foreach (var cmdEvent in cmd.ListenAsync())
{switch (cmdEvent){case StartedCommandEvent started:_output.WriteLine($"Process started; ID: {started.ProcessId}");break;case StandardOutputCommandEvent stdOut:_output.WriteLine($"Out> {stdOut.Text}");break;case StandardErrorCommandEvent stdErr:_output.WriteLine($"Err> {stdErr.Text}");break;case ExitedCommandEvent exited:_output.WriteLine($"Process exited; Code: {exited.ExitCode}");break;}
}

点评区

个人建议使用第三方的开源包,作者能写出一套肯定也是踩了不少坑,都是一些经验总结哈!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/292348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何判断对象是不是出轨了?

1 教官让学生表演才艺(素材来源网络,侵删)▼2 人类幼崽的想象力能有多丰富?(素材来源豆瓣,侵删)▼3 来自医生的建议(素材来源网络,侵删)▼4 这个手机壳很不…

MVC-控制器向View传值的三种方法

1.提供视图模型对象 你能把一个对象作为View方法的参数传递给视图. public ViewResult Index() { DateTime date DateTime.Now; return View(date); } 然后我们在视图中使用Razor的Model关键字来访问这个对象 { ViewBag.Title "Index"; } <h2>Index</h2&g…

Android之内核学习笔记

0、Android系统启动 《Android系统启动流程 -- bootloader》 《The Android boot process from power on》 《Android 启动过程介绍》 《Android培训班(86)内核运行之前的引导程序》 这是一系列文章 《Android 分区挂载》 1、init 《深入理解android 卷1》 第3章 深入理解…

能源项目xml文件 -- app-context.xml

<?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:context"http://www.springframework.org/schema/c…

python列表操作程序_Python列表操作,比较常见的10个问题

列表是比较常用的数据类型之一&#xff0c;本文整理了 StackOverflow 上关于列表操作被访问较多的10个问答&#xff0c;如果你在开发过程中遇到这些问题&#xff0c;不妨先思考一下如何解决。1、迭代列表&#xff0c;如何访问列表下标索引普通版&#xff1a;items [8, 23, 45]…

ViewData 和 ViewBag 到底有什么区别?

咨询区 user469652请问 ASP.NET MVC 中的 ViewBag 和 ViewData 到底哪一个好&#xff0c;在实际项目开发中应该选择哪一个&#xff1f;回答区 Naresh RavlaniViewData它需要对复杂类型进行类型转换并且还要检查null值来防止错误。ViewBag它不需要对 复杂类型 进行类型转换。考虑…

更新整理本人所有博文中提供的代码与工具(C++,2013.11)

为了更方便地管理博文中涉及的各种代码与工具资源&#xff0c;现在把这些资源迁移到 Google Code 中&#xff0c;有兴趣者可前往下载。C1、《通用高性能 Windows Socket 组件 HP-Socket v3.0.2 正式发布》 《基于 IOCP 的通用异步 Windows Socket TCP 高性能服务端组件的设计…

Android之用AccessibilityService实现红包插件

微信红包自打出世以来就极其受欢迎,抢红包插件可谓红极一时.今天,我们重新谈谈抢红包插件的哪些事儿.本质上,抢红包插件的原理不难理解,其过程就是在收到红包时,自动模拟点击.做过自动化UI测试的童鞋应该非常熟悉了.那么问题来了,我们怎么知道有没有红包,又怎么模拟点击操作呢?…

【软件周刊】D语言卷土重来,Vue.js 应获 1024 个赞,小薇可以一键启动了

2019独角兽企业重金招聘Python工程师标准>>> 一、 前端相关 1. Vue.js — Vue.js 这次的更新比较频繁&#xff0c;才刚刚更新完 2.0.4 版本不久&#xff0c;立马就更新出了 2.0.5 版本。这次发布的 2.0.4 版本主要的亮点是 SSR 性能改进了 20%&#xff0c;然后接着更…

LINUX内核完全注释

学习教材&#xff1a;LINUX内核完全注释&#xff0c;内核版本0.11&#xff0c;修正版V3.0 赵炯编著 参考教材&#xff1a;UNIX操作系统设计--M. J. Bach&#xff0c; programming the 80x86 --John H. Crawford MINIX操作系统的设计与实现--Andrew S.Tanenbaum --Tanenbaum 学…

Autofac实现拦截器和切面编程

Autofac.Annotation框架是我用.netcore写的一个注解式DI框架&#xff0c;基于Autofac参考 Spring注解方式所有容器的注册和装配,切面,拦截器等都是依赖标签来完成。开源地址&#xff1a;https://github.com/yuzd/Autofac.Annotation上期说了Autofac实现有条件的DI本期讲的是最新…

python好用的模块和包_Python模块和包详细讲解与实例分析

一丶模块我们经常说模块模块的,究竟什么是模块呢?一个模块就是包含了Python定义和声明的文件,文件名就是模块名字加上.py的后缀但其实import加载的模块分为四个通用类别:1.使用Python编写的代码(.py文件)2.已被编译为共享库或DLL的C或C扩展3.包好一组模块的包4.使用C编写并链接…

C语言之struct A *b和struct A c区别

struct A *b; 是指针 struct A c; 是定义了一个struct A对象,你得提供相应的结构体的具体定义 结构体A没有具体的定义,当struct A c时,实际是定义一个结构体变量,这是要分配存储空间的,空间大小依结构体中具体的变量而定,如果没有具体的结构体定义,编译器不知道结构体到底是什…

JS的类型转换

当string&#xff0c;number函数不被用作构造函数的可以当成转换函数 如 string(false),number(‘3’),boolean([]) Object(3) new number(3); 除了NULL和undefined以外任何值都具有toString()方法 JS 在执行程序的时候会自动检测表达式来进行变量转换。 显示转换变量&#xf…

linux 下执行.sh文件总是提示permission denied

今天执行.sh文件懂得时候提示 permission denied错误 解决办法: chmod 777 file.sh 或者 chmod+x file.sh 比如我们执行一个变量加1的时候,不能这样写 a = 1; a = $($a +1) echo $a 需要这样写: a=1 a=$(($a+1)) echo $a 还有写sh文件的时候代码之间不需要留下空格…

ahjesus解决win下U盘无法写入的问题

可能是由于不同品牌的U盘出厂时磁盘分区和格式化方式不同而引起的兼容性问题。解决方案如下 启动cmd。输入diskpart&#xff0c;启动DISKPART工具 在DISKPART窗口中输入以下命令&#xff1a; >list disk &#xff08;此命令是列出所有磁盘驱动器&#xff0c;请务必看清楚你的…

[探索 .NET 6]01 揭开 ConfigurationManager 的面纱

在这个系列中&#xff0c;我将探索一下 .NET 6 中的一些新特性。已经有很多关于 .NET 6 的内容&#xff0c;包括很多来自 .NET 和 ASP.NET 团队本身的文章。在这个系列中&#xff0c;我将探索一下这些特性背后的一些代码。在这第一篇文章中&#xff0c;来研究一下 Configuratio…

mysql锁表_MySQL中Alter table 你不知道的性能问题

前言&#xff1a;MySQL 的大表运维总是令人头疼的一件事&#xff0c;特别是大表表结构的修改尤为困难。首先&#xff0c;alter table 的process不可被kill &#xff0c; 一旦执行就不可回退。其次&#xff0c;大多数的alter table操作都会涉及 lock --- copy to new table --- …