[C#]使用Process的StandardInput与StandardOutput写入读取控制台数据

本文为原创文章、源代码为原创代码,如转载/复制,请在网页/代码处明显位置标明原文名称、作者及网址,谢谢!

开发工具:VS2017

语言:C#

DotNet版本:.Net FrameWork 4.0及以上

一、为了演示使用程序读取控制台数据,现在需要编写一个控制台程序,代码如下:

using System;

namespace Test
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
            string content = Console.ReadLine();
            if(content.ToUpper() == "TEST")
            {
                Console.WriteLine("You have type correctly.\r\nCongratulation!");
            }
            else
            {
                Console.WriteLine("Sorry,Uncorrectly!\r\nSee you later.");
            }
        }
    }
}

这段代码的作用是:

1)在控制台输出“Hello World!”;

2)当输出“Test”(不管大小写),则输出:

You have type correctly.

Congratulation!

3)当输出其他时,则输出:

Sorry,Uncorrectly!

See you later.

以上是必备的应用程序,如果不使用该程序,可以使用System32文件夹下的cmd.exe来当做控制台应用程序;

二、将以上生成的程序Test.exe拷贝到D盘根目录下;

三、新建一个控制台应用程序(MainConsoleApp),来操作之前的控制台应用程序,并编写以下代码:

using System;
using System.Diagnostics;

namespace MainConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            Process proc = new Process
            {
                StartInfo = new ProcessStartInfo
                {
                    FileName = @"D:\test.exe",
                    UseShellExecute = false,
                    CreateNoWindow = true,
                    RedirectStandardInput = true,
                    RedirectStandardOutput = true
                }
            };
            proc.Start();
            proc.StandardInput.WriteLine("Test");
            string line = null;
            while (!proc.StandardOutput.EndOfStream)
            {
                line +=  proc.StandardOutput.ReadLine() + Environment.NewLine;
            }
            Console.WriteLine(line);
            proc.WaitForExit();

            //再次启动
            proc.Start();
            proc.StandardInput.WriteLine("T");
            string content = proc.StandardOutput.ReadToEnd();
            Console.WriteLine(content);
            proc.WaitForExit();

            Console.ReadKey();
        }
    }
}

代码作用简介:

ProcessStartInfo.FileName:要启动的应用程序名称;

ProcessStartInfo.UseShellExecute:要重定向 IO流,Process对象必须将 UseShellExecute属性设置为false;

ProcessStartInfo.CreateNoWindow:是否以没有窗体的模式创建应用程序,默认为false,即有窗体,如为true,即隐藏窗体。在这里不设置该值也可以;

ProcessStartInfo.RedirectStandardInput:标准输入流的重定向,重定向至Process,我们可以通过Process.StandardInput.WriteLine将数据写入标准流;

ProcessStartInfo.RedirectStandardOutput:与RedirectStandardInput相反,这是标准输出流的重定向,我们可以通过Process.RedirectStandardOutput.ReadLine等方法读取标准流数据。

Process.StandardInput.WriteLine:将数据写入标准流;

Process.StandardOutput.ReadLine(或ReadToEnd):从标准流读取数据。

四、该程序将向Test.exe写入数据,并从Test.exe读回数据,这里使用了重定向技术,运行结果如下:

我们可以看到,原来是Test.exe的程序,所有的数据操作都进行了重定向,直接在MainConsoleApp.exe进行了输入输出。

这个技术不仅仅可以用于以上的示例,还可以用于其他具有控制台输入输出的程序,如cmd.exe,这里不进行举例,自己进行试验即可。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏前端布道

JavaScript之Event Loop

先看段代码: console.log(1); setTimeout(function () { console.log(2); new Pr...

27012
来自专栏卡少编程之旅

js线程机制的介绍和练习

31513
来自专栏实战docker

Java的wait()、notify()学习三部曲之二:修改JVM源码看参数

在上一章《 Java的wait()、notify()学习三部曲之一:JVM源码分析》中,我们通过JVM源码分析了线程同步的相关操作,但还是留下了一些疑惑未解:在...

2389
来自专栏编码小白

tomcat源码解读四 tomcat中的processer

     Processor是一个接口,针对于不同协议下具有不同的具体实现类,其实现类的具体功能是处理http请求,主要是对协议进行解析,状态处理以及响应。然后...

4167
来自专栏BinarySec

mmap及linux地址空间随机化失效漏洞

Linux下动态库是通过mmap建立起内存和文件的映射关系。其定义如下void* mmap(void* start,size_t length,int prot...

871
来自专栏zhisheng

JAVA虚拟机关闭钩子(Shutdown Hook)

当你认真的去看一个组件的源码的时候,你会经常看见这种关闭钩子的函数,如果你不了解的话,谷歌一下,你就会发现如下文章就是搜索引擎出来的第一篇,不愧是出自我们优秀的...

1013
来自专栏陈纪庚

js事件循环

之前有看过一些事件循环的博客,不过一阵子没看就发现自己忘光了,所以决定来自己写一个博客总结下!

872
来自专栏二进制文集

JDK Timer 实现原理分析

注意其中最大的区别,在于 schedule 调用 sched 函数时,将传入的 period 取反了。如果某次执行任务的开始时间延后了,那么此后的每次任务都会延...

573
来自专栏老马说编程

(80) 定时任务的那些坑 / 计算机程序的思维逻辑

本节探讨定时任务,定时任务的应用场景是非常多的,比如: 闹钟程序或任务提醒,指定时间叫床或在指定日期提醒还信用卡 监控系统,每隔一段时间采集下系统数据,对异...

2369
来自专栏飞雪无情的博客

Android中关于线程使用的几点注意事项

我们都知道Android是单线程模型,这意味着Android UI操作并不是线程安全的并且这些操作必须在UI线程中执行,所以你单纯的new一个Thrad并且st...

653

扫码关注云+社区