Я запускаю консольное приложение, но когда я перенаправляю стандартный вывод, я всегда ничего не получаю!
Когда я не перенаправляю его и устанавливаю CreateNoWindow
кому: false
, Я вижу все правильно в консоли, но когда я перенаправляю ее, StandardOutput.ReadToEnd()
всегда возвращает пустую строку.
Process cproc = new Process();
cproc.StartInfo.CreateNoWindow = true;
cproc.StartInfo.FileName = Dest;
cproc.StartInfo.RedirectStandardOutput = true;
cproc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
cproc.StartInfo.UseShellExecute = false;
cproc.EnableRaisingEvents = true;
cproc.Start();
cproc.Exited += new EventHandler(cproc_Exited);
while(!stop)
{
result += cproc.StandardOutput.ReadToEnd();
}
EventHandler cproc_exited
просто наборы stop
кому: true
. Может кто-то объяснять почему result
всегда string.Empty
?
] Почему ты петляешь? Как только он прочитан до конца, он больше не сможет читать данные, не так ли?[
] []Вы уверены, что текст на самом деле записывается на []StandardOutput[
], а не на []StandardError[
]?[
](И да, очевидно, что вы хотите установить []RedirectStandardOutput[
] на true, а не на false. Я предположил, что это просто случай, когда вы копируете неправильную версию своего кода.)[
]EDIT: Как я уже советовал в комментариях, вы должны читать со стандартного вывода и стандартной ошибки в отдельных потоках. Делайте []а не [] ожидание выхода процесса - это может закончиться тупиком, когда вы ждете выхода процесса, но процесс блокирует попытки записи в stderr/stdout, потому что вы не читали из буфера.[
] []Или вы можете подписаться на события OutputDataReceived и ErrorDataReceived, чтобы не использовать лишние потоки.[
].]У вас переадресация стандартного out отключена. Попробуйте изменить [
] [cproc.StartInfo.RedirectStandardOutput = false;
]
[] на [
] [cproc.StartInfo.RedirectStandardOutput = true;
]
[] Работает ли для вас следующий образец из []MSDN[]?[
] [// Start the child process.
Process p = new Process();
// Redirect the output stream of the child process.
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "Write500Lines.exe";
p.Start();
// Do not wait for the child process to exit before
// reading to the end of its redirected stream.
// p.WaitForExit();
// Read the output stream first and then wait.
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
] Избавьтесь от цикла и переведите вызов на ReadToEnd
на cproc_Exited
.