如何从控制台进程中只捕获一行
本文关键字:一行 控制台 进程 | 更新日期: 2023-09-27 18:13:07
我有一个应用程序,它启动并读取控制台进程的标准输出。在控制台进程中,我调用一些写入控制台的DLL文件,但我不想捕获这些消息,我只想捕获它们发送的输出字符串。
I tried doing:
verboseMethod(); //method writting things into the console
output = dllMethod(); //method returning what I want
Console.Clear();
Console.Out.Write(output)
我这样做,所以我相信我在Console.Clear()执行之前读取了所有内容:
exeProcess.BeginOutputReadLine();
string errString = exeProcess.StandardError.ReadToEnd();
你能给我一个替代方案吗?比如等待直到最后一个输出消息给出或类似的东西?
编辑
我相信像这样的东西会有所帮助(如果它存在的话)…我可以告诉控制台不要重定向输出或不要在某一点上写任何东西,然后允许它在代码的其他地方再次写入吗?如:
Console.CloseBuffer();
Console.OpenBuffer();
您应该尝试使用输出的异步重定向,并打开和关闭'EnableRaisingEvents',以便您只在您想要的执行之间捕获。使用BeginOutputReadLine()和CancelOutputRead()来启动/停止控制台读取。
var myOutput = new StringBuilder();
var myProcess = new Process();
myProcess.StartInfo = new ProcessStartInfo(path, command);
myProcess.StartInfo.UseShellExecute = false;
myProcess.StartInfo.RedirectStandardOutput = true;
myProcess.StartInfo.RedirectStandardError = true;
myProcess.EnableRaisingEvents = true;
myProcess.OutputDataReceived += (object sendingProcess, DataReceivedEventArgs e) =>
{
if (e.Data != null)
{
myOutput.AppendLine(e.Data);
}
};
myProcess.ErrorDataReceived += (object sendingProcess, DataReceivedEventArgs e) =>
{
if (e.Data != null)
{
myOutput.AppendLine(e.Data);
}
};
myProcess.Start();
verboseMethod();
//Start Capture here!
myProcess.BeginErrorReadLine();
myProcess.BeginOutputReadLine();
dllMethod();