Могу ли я захватить выходные данные запущенного процесса без «кражи» выходных данных?

#c#

#c#

Вопрос:

Множество ответов на другие вопросы говорят вам, что вы можете захватить выходные данные процесса, используя код, выглядящий примерно так:

 public async Task Run()
{
    await Task.Run(() =>
    {
        using (Process process = new Process()
        {
            StartInfo = new ProcessStartInfo
            {
                WindowStyle = ProcessWindowStyle.Normal,
                RedirectStandardOutput = true,
                RedirectStandardError = true,
                FileName = "cmd",
                Arguments = "path/filename.bat",
            }
        })
        {
            process.OutputDataReceived  = Process_OutputDataReceived;
            process.ErrorDataReceived  = Process_ErrorDataReceived;
            process.Start();
            process.BeginOutputReadLine();
            process.BeginErrorReadLine();

            process.WaitForExit();
        }
    });
}

private void Process_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
    if (e.Data != null)
    {
        log.Error(e.Data);
    }
}

private void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
    if (e.Data != null)
    {
        log.Info(e.Data);
    }
}
  

Существует множество вариантов, которые более или менее обеспечивают одно и то же, но все они перенаправляют стандартные выходные данные / ошибки — есть ли способ захватить их, сохраняя их отображение в окне cmd?

Комментарии:

1. Зачем вам нужно показывать выходные данные с исходного терминала, если ваша программа перенаправляет их? Можете ли вы просто создать элемент управления в своей программе, который отображает выходные данные дочернего процесса, или даже создать собственное окно консоли, если хотите, чтобы оно выглядело так же?

2. Я пометил это как дубликат, но, пожалуйста, дайте мне знать, если дубликат не решит ваш вопрос (и обновите свой вопрос с учетом специфики того, что еще вы хотите).

3. Хитрость заключается в том, чтобы сделать что-то вроде var output = p.StandardOutput.ReadToEnd(); перед вызовом process.WaitForExit();

4. @RufusL — этот вопрос, похоже, не отвечает на мой вопрос. Они спрашивают о чтении выходных данных процесса в режиме реального времени, а не о необходимости ждать завершения процесса, как это уже делает код в моем вопросе. Я спрашиваю о чтении выходных данных процесса, не удаляя их из окна консоли.

5. Для потоков нет «разделителя». Если вы хотите его, вам придется его создать. Например, вы могли бы добавлять вызовы в Console.Error.Write и Console.Write в Process_ErrortDataReceived . и ‘Process_OutputDataReceived.