Capturing console output from a .NET application (C#)
This can be quite easily achieved using the ProcessStartInfo.RedirectStandardOutput property. A full sample is contained in the linked MSDN documentation; the only caveat is that you may have to redirect the standard error stream as well to see all output of your application.
Process compiler = new Process();
compiler.StartInfo.FileName = "csc.exe";
compiler.StartInfo.Arguments = "/r:System.dll /out:sample.exe stdstr.cs";
compiler.StartInfo.UseShellExecute = false;
compiler.StartInfo.RedirectStandardOutput = true;
compiler.Start();
Console.WriteLine(compiler.StandardOutput.ReadToEnd());
compiler.WaitForExit();
Seeing console output of a sub process started by a .net application
You can't access the console of the sub-process, but you can redirect the output (stdout
and stderr
, ideally), and pipe them to your own console/display. An example of redirecting stdout of a sub-process is shown in full on MSDN
How to capture console output from a service C#?
Are you able to change the service code at all? If so, using Console.SetOut to write to a file instead would be the most obvious first port of call. Then change to using a proper logging library for the next release :)
Redirect console.writeline from windows application to a string
As it seems like you want to catch the Console output in realtime, I figured out that you might create your own TextWriter
implementation that fires an event whenever a Write
or WriteLine
happens on the Console
.
The writer looks like this:
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;
}
If it's a WinForm app, you can setup the writer and consume its events in the Program.cs like this:
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main()
{
using (var consoleWriter = new ConsoleWriter())
{
consoleWriter.WriteEvent += consoleWriter_WriteEvent;
consoleWriter.WriteLineEvent += consoleWriter_WriteLineEvent;
Console.SetOut(consoleWriter);
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
}
static void consoleWriter_WriteLineEvent(object sender, Program.ConsoleWriterEventArgs e)
{
MessageBox.Show(e.Value, "WriteLine");
}
static void consoleWriter_WriteEvent(object sender, Program.ConsoleWriterEventArgs e)
{
MessageBox.Show(e.Value, "Write");
}
How do I run a Console Application, capture the output and display it in a Literal?
I've done something very similar to your solution -- this is working fine for me:
ProcessStartInfo pInfo = new ProcessStartInfo("cmd.exe");
pInfo.FileName = exePath;
pInfo.WorkingDirectory = new FileInfo(exePath).DirectoryName;
pInfo.Arguments = args;
pInfo.CreateNoWindow = false;
pInfo.UseShellExecute = false;
pInfo.WindowStyle = ProcessWindowStyle.Normal;
pInfo.RedirectStandardOutput = true;
Process p = Process.Start(pInfo);
p.OutputDataReceived += p_OutputDataReceived;
p.BeginOutputReadLine();
p.WaitForExit();
// set status based on return code.
if (p.ExitCode == 0) this.Status = StatusEnum.CompletedSuccess;
else this.Status = StatusEnum.CompletedFailure;
The interesting differences seem to be the use of WaitForExit(), and possibly the BeginOutputReadLine().
Using Process.Start to capture console output
Given the description:
you would remove the event subscription and the call to
process.BeginOutputReadLine()
he is talking about those two lines:
process.OutputDataReceived += (o, e) => { if (e.Data == null) mreOut.Set(); else output(e.Data); };
process.BeginOutputReadLine();
Note that the code you substitute to this should be just:
new ReadOutput(process.StandardInput, mreOut);
ReadOutput
class would be outside the Run
method (since in C#, methods cannot contain classes).
how to remove the particular type of info from console NLog, .NET
Looks like output from NLog InternalLogger: https://github.com/NLog/NLog/wiki/Internal-Logging.
You can either change internalLogLevel="Warn"
or disable output to console internalLogToConsole="false"
(Is disabled by default).
Related Topics
Combining Two Expressions (Expression≪Func≪T, Bool≫≫)
What Is a Good Pattern For Using a Global Mutex in C#
How to Display a Decimal Value to 2 Decimal Places
Encrypting & Decrypting a String in C#
How to Execute a Stored Procedure Within C# Program
When to Use Static Classes in C#
Is There a Difference Between "Throw" and "Throw Ex"
Input String Was Not in a Correct Format
Asp.Net MVC 5 Culture in Route and Url
How to Create a New Object Instance from a Type
What's the Use/Meaning of the @ Character in Variable Names in C#
Getting All Types That Implement an Interface
Transitioning from Windows Forms to Wpf
A Field Initializer Cannot Reference the Nonstatic Field, Method, or Property