Как я могу скопировать стандартный вывод процесса (копировать, а не перенаправлять)? - PullRequest
2 голосов
/ 21 октября 2011

Есть много примеров, которые показывают, как перенаправить стандартный вывод другого приложения.Однако я хотел бы позволить приложению сохранять свой стандартный вывод и получать только копию стандартного вывода в моем родительском процессе.Возможно ли это?

Мой сценарий: у меня есть несколько тестов (с использованием Visual Studio Test Runner), которые запускают внешний процесс (сервер) для выполнения своего тестирования.Сервер выводит много полезной отладочной информации в свой стандартный вывод, который я хотел бы включить в результаты своего теста.

Я могу захватить выходные данные процесса и вывести их через Trace.WriteLine, чтобы он появился в тестеподробности позже.Однако было бы неплохо увидеть окно сервера с его выводом во время выполнения теста, чтобы увидеть текущий прогресс (тест может выполняться долго).

Поэтому я ищу способы скопировать эту информациювместо того, чтобы просто перенаправить его.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 21 октября 2011

Будет ли это работать для вас?

        var outputText = new StringBuilder();
        var errorText = new StringBuilder();

        using (var process = Process.Start(new ProcessStartInfo(
            @"YourProgram.exe",
            "arguments go here")
            {
                RedirectStandardError = true,
                RedirectStandardOutput = true,
                UseShellExecute = false
            }))
        {
            process.OutputDataReceived += (sendingProcess, outLine) =>
            {
                outputText.AppendLine(outLine.Data); // capture the output
                Console.Out.WriteLine(outLine.Data); // echo the output
            }

            process.ErrorDataReceived += (sendingProcess, errorLine) =>
            {
                errorText.AppendLine(errorLine.Data); // capture the error
                Console.Error.WriteLine(errorLine.Data); // echo the error
            }

            process.BeginOutputReadLine();
            process.BeginErrorReadLine();
            process.WaitForExit();
            // At this point, errorText and outputText StringBuilders
            // have the captured text.  The event handlers already echoed the
            // output back to the console.
        }
1 голос
/ 21 октября 2011

А как насчет написания небольшой программы, которая перенаправляет STDIN в STDOUT, и в то же время делает с ней что-то еще?

Затем можно заменить команду, запускающую процесс сервера, на команду, запускающую ееи направляет свою продукцию в вышеуказанную утилиту.Таким образом, вы будете иметь как программный доступ к выходу, так и видеть его в реальном времени в окне вывода.

...