在 C# 中解析控制台输出
Parse console output in c#
我有一个 API 方法 WriteSerie()
可以在控制台上写入一些数据。我的目标是实时解析 WriteSerie()
的输出,这样如果输出中发生特定情况,控制台会写入我定义的另一行。
用于此目的的方法是什么?
第一个解决方案:
Console.WriteLine("Hello World");
FileStream fs = new FileStream("Test.txt", FileMode.Create);
// First, save the standard output.
TextWriter tmp = Console.Out;
StreamWriter sw = new StreamWriter(fs);
Console.SetOut(sw);
Console.WriteLine("Hello file");
Console.SetOut(tmp);
Console.WriteLine("Hello World");
sw.Close();
您可以使用任何 streamwriter。
第二种解决方案:
public class ConsoleWriterEventArgs : EventArgs
{
public string Value { get; private set; }
public ConsoleWriterEventArgs(string value)
{
Value = value;
}
}
public class ConsoleWriter : TextWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
public override void Write(string value)
{
if (WriteEvent != null) WriteEvent(this, new ConsoleWriterEventArgs(value));
base.Write(value);
}
public override void WriteLine(string value)
{
if (WriteLineEvent != null) WriteLineEvent(this, new ConsoleWriterEventArgs(value));
base.WriteLine(value);
}
public event EventHandler<ConsoleWriterEventArgs> WriteEvent;
public event EventHandler<ConsoleWriterEventArgs> WriteLineEvent;
}
设置侦听器事件:
static void Main()
{
using (var consoleWriter = new ConsoleWriter())
{
consoleWriter.WriteEvent += consoleWriter_WriteEvent;
consoleWriter.WriteLineEvent += consoleWriter_WriteLineEvent;
Console.SetOut(consoleWriter);
}
}
您将收到活动中的每一行
我认为您想对控制台的输出进行一般修改,例如,如果 Serie
转到输出,您需要在它之前写一条消息。所以你的代码可能是这样的:
class MyWriter : TextWriter
{
private TextWriter originalOut;
public MyWriter()
{
originalOut = Console.Out;
}
public override Encoding Encoding
{
get { return new System.Text.ASCIIEncoding(); }
}
public override void WriteLine(string message)
{
originalOut.WriteLine(CheckMySerie(message));
}
public override void Write(string message)
{
originalOut.Write(CheckMySerie(message));
}
private string CheckMySerie(string message)
{
if (message.Contains("MySerie"))
return "My Serie has been found\n" + message;
else
return message;
}
}
class Program
{
static void Main(string[] args)
{
Console.SetOut(new MyWriter());
Console.WriteLine("test 1 2 3");
Console.WriteLine("test MySerie 2 3");
Console.ReadKey();
}
}
我有一个 API 方法 WriteSerie()
可以在控制台上写入一些数据。我的目标是实时解析 WriteSerie()
的输出,这样如果输出中发生特定情况,控制台会写入我定义的另一行。
用于此目的的方法是什么?
第一个解决方案:
Console.WriteLine("Hello World");
FileStream fs = new FileStream("Test.txt", FileMode.Create);
// First, save the standard output.
TextWriter tmp = Console.Out;
StreamWriter sw = new StreamWriter(fs);
Console.SetOut(sw);
Console.WriteLine("Hello file");
Console.SetOut(tmp);
Console.WriteLine("Hello World");
sw.Close();
您可以使用任何 streamwriter。
第二种解决方案:
public class ConsoleWriterEventArgs : EventArgs
{
public string Value { get; private set; }
public ConsoleWriterEventArgs(string value)
{
Value = value;
}
}
public class ConsoleWriter : TextWriter
{
public override Encoding Encoding { get { return Encoding.UTF8; } }
public override void Write(string value)
{
if (WriteEvent != null) WriteEvent(this, new ConsoleWriterEventArgs(value));
base.Write(value);
}
public override void WriteLine(string value)
{
if (WriteLineEvent != null) WriteLineEvent(this, new ConsoleWriterEventArgs(value));
base.WriteLine(value);
}
public event EventHandler<ConsoleWriterEventArgs> WriteEvent;
public event EventHandler<ConsoleWriterEventArgs> WriteLineEvent;
}
设置侦听器事件:
static void Main()
{
using (var consoleWriter = new ConsoleWriter())
{
consoleWriter.WriteEvent += consoleWriter_WriteEvent;
consoleWriter.WriteLineEvent += consoleWriter_WriteLineEvent;
Console.SetOut(consoleWriter);
}
}
您将收到活动中的每一行
我认为您想对控制台的输出进行一般修改,例如,如果 Serie
转到输出,您需要在它之前写一条消息。所以你的代码可能是这样的:
class MyWriter : TextWriter
{
private TextWriter originalOut;
public MyWriter()
{
originalOut = Console.Out;
}
public override Encoding Encoding
{
get { return new System.Text.ASCIIEncoding(); }
}
public override void WriteLine(string message)
{
originalOut.WriteLine(CheckMySerie(message));
}
public override void Write(string message)
{
originalOut.Write(CheckMySerie(message));
}
private string CheckMySerie(string message)
{
if (message.Contains("MySerie"))
return "My Serie has been found\n" + message;
else
return message;
}
}
class Program
{
static void Main(string[] args)
{
Console.SetOut(new MyWriter());
Console.WriteLine("test 1 2 3");
Console.WriteLine("test MySerie 2 3");
Console.ReadKey();
}
}