当 Process 将文本写入其标准流中时,通常将在控制台上显示该文本。通过重定向 StandardOutput 流,可以操作或取消进程的输出。例如,可以筛选文本、用不同方式将其格式化,也可以将输出同时写入控制台和指定的日志文件中。有两种方式:同步、异步。

1.      先说同步方法,这种方法网上有很多例子,废话少说,贴上代码大家一看就明白了:

Processprocess = new Process();

process.StartInfo.FileName = "cmd.exe";

process.StartInfo.UseShellExecute = false;   // 是否使用外壳程序

process.StartInfo.CreateNoWindow = true;   //是否在新窗口中启动该进程的值

process.StartInfo.RedirectStandardInput = true;  // 重定向输入流

//process.StartInfo.RedirectStandardOutput= true;  //重定向输出流

//process.StartInfo.RedirectStandardError= true;  //重定向错误流

stringstrCmd = "ping www.163.com /r/n";

strCmd += "exit";

process.Start();

process.StandardInput.WriteLine(strCmd);

stringoutput = process.StandardOutput.ReadToEnd();//获取输出信息

process.WaitForExit();

int n =process.ExitCode;  // n 为进程执行返回值

process.Close();

可以同步或异步读取重定向的 StandardOutput 流。ReadReadLine 和 ReadToEnd 等方法对进程的输出流执行同步读取操作。这些同步读取操作只有在关联的 Process 写入其StandardOutput 流或关闭该流后才能完成。

同步读取操作在读取 StandardOutput 流的调用方及写入该流中的子进程之间引入一个依赖项。这些 依赖项可能导致产生死锁情况。调用方读取子进程的重定向流时依赖于该子进程。调用方将等待读取操作,直到子进程写入流或关闭流为止。子进程写入足够多的数 据以填充重定向流的时间依赖于父进程。子进程将等待下一次写操作,直到父进程读取了全部流或关闭该流为止。当调用方和子进程相互等待对方完成操作时,就会 产生死锁情况,使双方都无法继续执行操作。可以通过计算调用方和子进程之间的依赖项从而避免出现死锁情况。

2.      再来说一下异步方法

使用事件和委托,进程有2个事件OutputDataReceived、OutputDataReceived。
我们可以注册这2个事件,使该进程在往Output和error流中填充数据时,调用相应的事件响应函数,及时处理流中数据,从而避免流被填满而发生的死锁情况,在WaitForExit之前调用BeginOutputReadLine 或者BeginErrorReadLine 开始异步读取。此方法会为流输出启用一个指定的事件处理程序并立即返回到调用方,这样当流输出被定向到该事件处理程序时,调用方还可以执行其他操作。

注意

若要使用 StandardOutput,必须将 ProcessStartInfo.UseShellExecute 设置为 false,并且将 ProcessStartInfo.RedirectStandardOutput 设置为 true。否则,读取StandardOutput 流时将引发异常。

// using System.Diagnostics;

// 运行新进程

ProcessStartInfostartInfo =newProcessStartInfo(exeName);

startInfo.CreateNoWindow = true;   //不创建窗口

startInfo.UseShellExecute = false;//不使用系统外壳程序启动,重定向输出的话必须设为false

startInfo.RedirectStandardOutput = true; //重定向输出,而不是默认的显示在dos控制台上

startInfo.RedirectStandardError = true;

try

{

Processprocess =
Process.Start(startInfo);

process.OutputDataReceived += (s, _e)=> Console.WriteLine(_e.Data);

process.ErrorDataReceived += (s, _e) =>Console.WriteLine(_e.Data);

//当EnableRaisingEvents为true,进程退出时Process会调用下面的委托函数

process.Exited += (s, _e) => Console.WriteLine("Exited with " + _process.ExitCode);

process.EnableRaisingEvents = true;

process.BeginOutputReadLine();

process.BeginErrorReadLine();

process.WaitForExit();

}

catch (Exception e)

{

Console.WriteLine(ex.Message);

}

3.      注意事项

不能对同一个重定向流混合使用异步和同步读取操作。在异步或同步模式下打开 Process 的重定向流后,对该流的所有进一步的读取操作都必须在同一模式下进行。例如,不要对StandardOutput 流调用BeginOutputReadLine 后接着调用ReadLine,反之亦然。但是,可以在不同的模式下读取两个不同的流。例如,可以先调用BeginOutputReadLine,然后再为StandardError
流调用 ReadLine

C#输入输出重定向的更多相关文章

  1. Linux Shell系列教程之(十六) Shell输入输出重定向

    本文是Linux Shell系列教程的第(十六)篇,更多Linux Shell教程请看:Linux Shell系列教程 Shell中的输出和输入的重定向是在使用中经常用到的一个功能,非常实用,今天就为 ...

  2. 【转载】标准输入输出重定向(Visual C++)

    原文:标准输入输出重定向(Visual C++) 引言 本人偶得在 Visual C++ 中进行输入输出重定向的办法,比通常的做法“freopen”更加的灵活和方便,特在此共享.目前,代码正在不断地摸 ...

  3. 全面理解Linux输入输出重定向

    全面理解Linux输入输出重定向 本教程通过视频方式讲解shell操作,理解感念,教程通俗易懂,比起看一大堆文档要舒服的多.本次教程主要讲解  Linux Shell 中支持输入输出重定向,用符号&l ...

  4. Linux学习笔记17——输入输出重定向

    1 何谓输入输出重定向? 默认情况下输入是由键盘输入的.输出是默认的输出到屏幕上.而输入输出重定向就是改变默认的输入输出方向 2 freopen函数 freopen是被包含与stdio.h头文件中,是 ...

  5. linux 输入输出重定向

    输入输出重定向 1,输入输出重定向,是针对过滤器的,不针对,编辑器和交互工具 2,>号只把正确的标准输出重定向,输出错误信息,可以用2> 3,新建或清空文件可以直接用>filenam ...

  6. shell之路【第四篇】输入输出重定向

    输出重定向 命令输出重定向的语法为: command > file 或 command >> file 这样,输出到显示器的内容就可以被重定向到文件.果不希望文件内容被覆盖,可以使用 ...

  7. 历史命令~/.bash_history,查看所有别名alias,命令执行顺序,命令行常用快捷键,输入输出重定向,wc统计字节单词行数

    历史命令大小:/etc/profile中字段HISTSIZE=1000 历史命令保存文件:~/.bash_history history -c 清空历史命令 history -w 把历史命令写入~/. ...

  8. Linux第六节随笔 输入输出重定向 、管道、通配符、wc / grep / tr / sort / cut / which /whereis /locate /find /

    三期第五讲 -高级文件管理1.输入输出重定向 ls -l /dev/stdin -> /proc/self/fd/0 标准输入 设备:键盘 标记:0 ls -l /dev/stdout -> ...

  9. C/C++中的输入输出重定向

    目录 一 C/C++中的输入输出重定向 1.1 C语言输入输出重定向 1.2 C++语言输入输出重定向 参考资料 注:原创不易,转载请务必注明原作者和出处,感谢支持! 一 C/C++中的输入输出重定向 ...

  10. shell编程 之 输入输出重定向

    1 输入输出重定向 标准输入:从终端得到命令,对于计算机来说,是从终端获得了命令,执行完了以后,结果和执行状态或者错误提示又会发回终端,这叫标准输出. 输入输出重定向就是从终端以外的别的地方得到输入, ...

随机推荐

  1. 如何用参数化SQL语句污染你的计划缓存

    你的SQL语句的参数化总是个好想法.使用参数化SQL语句你不会污染你的计划缓存——错!!!在这篇文章里我想向你展示下用参数化SQL语句就可以污染你的计划缓存,这是非常简单的! ADO.NET-AddW ...

  2. Activating Browser Modes with Doctype

    原文地址:https://hsivonen.fi/doctype/ In order to deal both with content written according to Web standa ...

  3. 【第一课】神奇的Context

    初学Android的困惑 初学Android跳转页面的时候,往往教程里是这么写的: Intent intent = new Intent(); //MyActivity就是当前的Activity,It ...

  4. [团队项目]expat不兼容BUG

    本周五软工团队项目的第一次前后端全部对接时,出了一个蛋疼的错误. 最初起因是小丽叔出于安全的考虑,使用守护进程来跑Web服务器.守护进程(Daemon)是运行在后台的一种特殊进程,如果服务器用root ...

  5. [C#高级编程]基础知识摘要一

    核心C#: 值类型存储在堆栈中,而引用类型存储在托管堆上. object类型可以用于两个目的: 可以使用object引用绑定任何子类型的对象 object类型执行许多一般用途的基本方法,包括Equal ...

  6. js页面跳转参考代码大全

    整理一下JS页面跳转参考代码 第一种:     <script language=/"javascript/" type=/"text/javascript/&qu ...

  7. Insus Search Utility Ver2

    一个搜索组件,虽然不是很强大,但它到现在为止,已经是第二个版本了.前一版本:http://www.cnblogs.com/insus/archive/2011/03/30/1999759.html此版 ...

  8. 判断s2是否能够被通过s1做循环移位(rotate)得到的字符串是否包含

    问题:给定两个字符串s1和s2,要求判断s2是否能够被通过s1做循环移位(rotate)得到的字符串包含.例如,S1=AABCD和s2=CDAA,返回true:给定s1=ABCD和s2=ACBD,返回 ...

  9. 【C#进阶系列】09 关于参数的故事

    可选参数和命名参数 不多说,上代码,自然懂 class Program { static void Main(string[] args) { var troy = new Troy(); troy. ...

  10. ActiveReports 9 新功能:可视化查询设计器(VQD)介绍

    在最新发布的ActiveReports 9报表控件中添加了多项新功能,以帮助你在更短的时间里创建外观绚丽.功能强大的报表系统,本文将重点介绍可视化数据查询设计器,无需手动编写任何SQL语句,主要内容如 ...