Захват вывода консоли из приложения .NET (C #) - PullRequest
117 голосов
/ 09 октября 2008

Как мне вызвать консольное приложение из моего .NET-приложения и захватить весь вывод, сгенерированный в консоли?

(Помните, я не хочу сначала сохранять информацию в файл, а затем повторно получать ее, так как хотел бы получить ее как живую).

Ответы [ 7 ]

148 голосов
/ 09 октября 2008

Это может быть легко достигнуто с помощью свойства ProcessStartInfo.RedirectStandardOutput . Полный образец содержится в связанной документации MSDN; единственное предостережение в том, что вам, возможно, придется перенаправить стандартный поток ошибок, чтобы увидеть весь вывод вашего приложения.

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();
26 голосов
/ 21 сентября 2016

Это немного лучше, чем принятый ответ от @mdb. В частности, мы также фиксируем вывод ошибок процесса. Кроме того, мы фиксируем эти выходные данные через события, потому что ReadToEnd () не работает, если вы хотите захватить и ошибку и обычный вывод. Мне потребовалось время, чтобы сделать эту работу, потому что на самом деле она также требует вызовов BeginxxxReadLine () после 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");
}
13 голосов
/ 09 октября 2008

Используйте ProcessInfo.RedirectStandardOutput для перенаправления вывода при создании процесса консоли.

Затем вы можете использовать Process.StandardOutput , чтобы прочитать вывод программы.

Вторая ссылка содержит пример кода, как это сделать.

7 голосов
/ 31 марта 2013

ConsoleAppLauncher - библиотека с открытым исходным кодом, созданная специально для ответа на этот вопрос. Он захватывает все выходные данные, генерируемые в консоли, и предоставляет простой интерфейс для запуска и закрытия консольного приложения.

Событие ConsoleOutput вызывается каждый раз, когда консоль записывает новую строку в стандартный вывод / вывод ошибок. Линии поставлены в очередь и гарантированно следуют порядку вывода.

Также доступно как пакет NuGet .

Пример вызова для получения полного вывода на консоль:

// Run simplest shell command and return its output.
public static string GetWindowsVersion()
{
    return ConsoleApp.Run("cmd", "/c ver").Output.Trim();
}

Пример с обратной связью в реальном времени:

// 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();
}
2 голосов
/ 09 сентября 2015

Добавлено process.StartInfo.**CreateNoWindow** = true; и 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;
        }
    }
}
2 голосов
/ 26 ноября 2011

Я добавил несколько вспомогательных методов к платформе O2 (проект с открытым исходным кодом), которые позволяют легко создавать сценарии взаимодействия с другим процессом через консольный вывод и ввод (см. * 1004). *

Также полезным может быть API, который позволяет просматривать вывод консоли текущего процесса (в существующем элементе управления или всплывающем окне). См. Этот пост в блоге для получения более подробной информации:

http://o2platform.wordpress.com/2011/11/26/api_consoleout-cs-inprocess-capture-of-the-console-output/ (этот блог также содержит подробности о том, как использовать вывод консоли новых процессов)

1 голос
/ 17 мая 2010

С 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...