Принятый ответ на этой странице имеет слабость, которая вызывает проблемы в редких ситуациях. Существует два дескриптора файла, в которые программы пишут по соглашению: stdout и stderr.
Если вы просто прочитаете один дескриптор файла, такой как ответ от Ray, и программа, которую вы запускаете, записывает достаточно вывода в stderr, она заполнит буфер вывода stderr и заблокирует его. Тогда ваши два процесса зашли в тупик. Размер буфера может быть 4K.
Это очень редко встречается в короткоживущих программах, но если у вас есть долго работающая программа, которая постоянно выводит в stderr, это произойдет в конце концов. Это сложно отладить и отследить.
Есть несколько хороших способов справиться с этим.
Один из способов - запустить cmd.exe вместо вашей программы и использовать аргумент / c для cmd.exe, чтобы вызвать вашу программу вместе с аргументом «2> & 1» для cmd.exe, чтобы он слился стандартный вывод и стандартный вывод
var p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/c mycmd.exe 2>&1";
Другим способом является использование модели программирования, которая читает обе ручки одновременно.
var p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = @"/c dir \windows";
p.StartInfo.CreateNoWindow = true;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardInput = false;
p.OutputDataReceived += (a, b) => Console.WriteLine(b.Data);
p.ErrorDataReceived += (a, b) => Console.WriteLine(b.Data);
p.Start();
p.BeginErrorReadLine();
p.BeginOutputReadLine();
p.WaitForExit();