c# - ejecutar - show console in winform
Captura de la salida de la consola desde una aplicación.NET(C#) (7)
Agregué varios métodos de ayuda a la plataforma O2 (proyecto de código abierto) que le permiten programar fácilmente una interacción con otro proceso a través de la salida y entrada de la consola (consulte http://code.google.com/p/o2platform/source/browse/trunk/O2_Scripts/APIs/Windows/CmdExe/CmdExeAPI.cs )
También es útil para usted la API que permite ver la salida de la consola del proceso actual (en una ventana emergente o de control existente). Vea esta publicación en el blog para más detalles: http://o2platform.wordpress.com/2011/11/26/api_consoleout-cs-inprocess-capture-of-the-console-output/ (este blog también contiene detalles de cómo consumir la salida de la consola de nuevos procesos)
¿Cómo invoco una aplicación de consola desde mi aplicación .NET y capturo todo el resultado generado en la consola?
(Recuerde, no quiero guardar la información primero en un archivo y luego volver a publicar como me gustaría recibirla en vivo).
De PythonTR - Python Programcıları Derneği, e-kitap, örnek :
Process p = new Process(); // Create new object
p.StartInfo.UseShellExecute = false; // Do not use shell
p.StartInfo.RedirectStandardOutput = true; // Redirect output
p.StartInfo.FileName = "c://python26//python.exe"; // Path of our Python compiler
p.StartInfo.Arguments = "c://python26//Hello_C_Python.py"; // Path of the .py to be executed
Esto mejora un poco la respuesta aceptada de @mdb. Específicamente, también capturamos la salida de error del proceso. Además, capturamos estos resultados a través de eventos porque ReadToEnd () no funciona si desea capturar el error y la salida regular. Me tomó un tiempo hacer que esto funcione porque realmente también requiere llamadas BeginxxxReadLine () después de Start ().
using System.Diagnostics;
Process process = new Process();
void LaunchProcess()
{
process.EnableRaisingEvents = true;
process.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(process_OutputDataReceived);
process.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(process_ErrorDataReceived);
process.Exited += new System.EventHandler(process_Exited);
process.StartInfo.FileName = "some.exe";
process.StartInfo.Arguments = "param1 param2"
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();
//below line is optional if we want a blocking call
//process.WaitForExit();
}
void process_Exited(object sender, EventArgs e)
{
Console.WriteLine(string.Format("process exited with code {0}/n", process.ExitCode.ToString()));
}
void process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
Console.WriteLine(e.Data + "/n");
}
void process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
Console.WriteLine(e.Data + "/n");
}
Esto se puede lograr fácilmente utilizando la propiedad ProcessStartInfo.RedirectStandardOutput . Una muestra completa está contenida en la documentación de MSDN vinculada; la única advertencia es que es posible que tenga que redirigir la secuencia de error estándar para ver todos los resultados de su aplicación.
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();
Use ProcessStartInfo.RedirectStandardOutput para redirigir la salida al crear su proceso de consola.
Luego puede usar Process.StandardOutput para leer la salida del programa.
El segundo enlace tiene un código de muestra de cómo hacerlo.
ConsoleAppLauncher es una biblioteca de código abierto creada específicamente para responder esa pregunta. Captura todos los resultados generados en la consola y proporciona una interfaz simple para iniciar y cerrar la aplicación de la consola.
El evento ConsoleOutput se activa cada vez que la consola escribe una línea nueva en la salida estándar / de error. Las líneas están en cola y garantizadas para seguir el orden de salida.
También disponible como paquete NuGet .
Ejemplo de llamada para obtener la salida de la consola completa:
// Run simplest shell command and return its output.
public static string GetWindowsVersion()
{
return ConsoleApp.Run("cmd", "/c ver").Output.Trim();
}
Muestra con comentarios en vivo:
// Run ping.exe asynchronously and return roundtrip times back to the caller in a callback
public static void PingUrl(string url, Action<string> replyHandler)
{
var regex = new Regex("(time=|Average = )(?<time>.*?ms)", RegexOptions.Compiled);
var app = new ConsoleApp("ping", url);
app.ConsoleOutput += (o, args) =>
{
var match = regex.Match(args.Line);
if (match.Success)
{
var roundtripTime = match.Groups["time"].Value;
replyHandler(roundtripTime);
}
};
app.Run();
}
process.StartInfo.**CreateNoWindow** = true;
agregado process.StartInfo.**CreateNoWindow** = true;
y timeout
private static void CaptureConsoleAppOutput(string exeName, string arguments, int timeoutMilliseconds, out int exitCode, out string output)
{
using (Process process = new Process())
{
process.StartInfo.FileName = exeName;
process.StartInfo.Arguments = arguments;
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
output = process.StandardOutput.ReadToEnd();
bool exited = process.WaitForExit(timeoutMilliseconds);
if (exited)
{
exitCode = process.ExitCode;
}
else
{
exitCode = -1;
}
}
}