#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.