我有一个无法编辑的应用程序,该应用程序可以从控制台读取并写入控制台,我想知道如何读取程序在说什么并将命令写回程序。
这是一个我的世界服务器,在这里我想阅读玩家在说什么,并根据所说内容运行命令。 (服务器是我无法编辑的应用程序)
我无法为服务器创建修改,因为我正在使用一个mod来检查是否对文件进行了其他修改,并且在这种情况下无法加载。
答案 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
>