有没有一种方法可以将控制台应用程序的输入/输出连接到另一个程序的输出/输入

时间:2019-07-23 17:08:06

标签: input console output

我有一个无法编辑的应用程序,该应用程序可以从控制台读取并写入控制台,我想知道如何读取程序在说什么并将命令写回程序。

这是一个我的世界服务器,在这里我想阅读玩家在说什么,并根据所说内容运行命令。 (服务器是我无法编辑的应用程序)

我无法为服务器创建修改,因为我正在使用一个mod来检查是否对文件进行了其他修改,并且在这种情况下无法加载。

1 个答案:

答案 0 :(得分:0)

我使用c#编写了一个简单的应用程序以开始使用,以重定向您需要在自己的应用程序中启动应用程序(在这种情况下为服务器)的I / O流。
首先,我们创建System.Diagnostics.Process类的新实例

var process = new Process();

然后我们指定开始信息

process.StartInfo = new ProcessStartInfo
{
    FileName = Console.ReadLine(), //Reads executable path from console
    RedirectStandardOutput = true,
    RedirectStandardInput = true,
    UseShellExecute = false
};

然后我们添加一个事件处理程序,在本示例中,它只是使用“>”前缀写行

process.OutputDataReceived += (object sender, DataReceivedEventArgs e) => Console.WriteLine($"> {e.Data}");

现在我们可以通过调用Process#Start()

开始该过程
process.Start();

最后我们可以在没有此情况的情况下调用Process#BeginOutputReadLine()OutputDataReceived事件将永远不会触发

process.BeginOutputReadLine();

要发送命令,您可以使用流程的StandardInput

process.StandardInput.WriteLine("command");

带有示例输出的完整工作代码(已通过cmd.exe测试,但必须与MC服务器一起使用)
代码:

static void Main(string[] args)
{
    Console.Write("Enter executable path: ");
    var process = new Process();
    process.StartInfo = new ProcessStartInfo
    {
        FileName = Console.ReadLine(), //Reads executable path, for example cmd is the input
        RedirectStandardOutput = true,
        RedirectStandardInput = true,
        UseShellExecute = false
    };
    process.OutputDataReceived += (object sender, DataReceivedEventArgs e) => Console.WriteLine($"> {e.Data}");
    process.Start();
    process.BeginOutputReadLine();

    process.StandardInput.WriteLine("echo a");

    //Prevent closing
    Console.ReadKey();
}

输出:

Enter executable path: cmd
> Microsoft Windows [Version 10.0.18362.239]
> (c) 2019 Microsoft Corporation. Minden jog fenntartva.
>
> F:\VisualStudio\StackOverflow\StackOverflow\bin\Debug\netcoreapp2.1>echo a
> a
>