Захваченный вывод пуст

Я пытаюсь захватить вывод из других приложений. Захват вывода из ping работает хорошо. Вывод переменной содержит ожидаемый результат.

var p = new Process();
 p.StartInfo.FileName = "ping";
 p.StartInfo.Arguments = "www.google.com";
 p.StartInfo.UseShellExecute = false;
 p.StartInfo.RedirectStandardOutput = true;
 p.StartInfo.CreateNoWindow = true;
 p.Start();
 var output = p.StandardOutput.*********();
 p.WaitForExit();

Но когда я использую этот код для захвата вывода expdp (который является инструментом oracle для экспорта), переменная пуста. Runnig же команда в консоли вернет некоторый вывод.

p.StartInfo.FileName = "expdp";
 p.StartInfo.Arguments = "help=y";

Я что-то пропустил?

2 ответа

Попробуйте проверить поток StandardError и посмотрите, есть ли там что-то там

var p = new Process();
p.StartInfo.FileName = "expdp";
p.StartInfo.Arguments = "help=y";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.CreateNoWindow = true;
p.Start();
var error = p.StandardError.*********();
var output = p.StandardOutput.*********();
p.WaitForExit();

одно замечание: если ваш выходной поток или строчка ошибок слишком длинны, этот подход может вызвать взаимоблокировки.

Если это так, вам нужно будет прочитать один из потоков асинхронно.


У меня была эта проблема раз. Самый последний ответ имеет смысл, но я не тестировал его, поскольку он появился через 6 месяцев после того, как я столкнулся с проблемой. В основном проблема заключается в том, что *********() читается в определенный момент, сразу после p.Start(), где пока ничего не выводилось на экран. Вы можете проверить это, поставив длинный сон между началом и *********().

licensed under cc by-sa 3.0 with attribution.