The doc states, что если вы хотите прочитать как StandardError и StandardOutput, вам нужно прочитать по крайней мере один из них асинхронно, чтобы избежать тупиков.
Кроме того, если вы вызываете ReadToEnd в одном из перенаправленных потоков, вы должны сделать это до, вызвав WaitForExit(). Если вы WaitForExit перед ReadToEnd, выходной буфер может заполнить, приостановить процесс, а это значит, что он никогда не выйдет. Это будет очень долго ждать. Это также в документе!
пример:
string output;
string error;
System.Diagnostics.Process p = new System.Diagnostics.Process
{
StartInfo =
{
FileName = program,
Arguments = args,
WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,
UseShellExecute = false,
}
};
if (waitForExit)
{
StringBuilder sb = new StringBuilder();
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
Action<Object,DataReceivedEventArgs> stdErrorRead = (o,e) =>
{
if (!String.IsNullOrEmpty(e.Data))
sb.Append(e.Data);
};
p.ErrorDataReceived += stdErrorRead;
p.Start();
// begin reading stderr asynchronously
p.BeginErrorReadLine();
// read stdout synchronously
output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
// return code is in p.ExitCode
if (sb.Length > 0)
error= sb.ToString();
}
Вы, вероятно, хотите, чтобы переместить вызов WaitForExit() перед строкой, которая считывает входные данные из перенаправлены выходного потока. Кроме того, при желании вы можете добавить флаг WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden, чтобы консольное приложение не появлялось, если оно не требует взаимодействия с пользователем. – LBushkin
Спасибо ... И есть способ, которым я могу скрыть окно ОС ??? Он работает прямо сейчас, но показывает пустые консоли ОС ... – user62958
Перед чтением ввода вам не нужно WaitForExit, но вам нужно выполнить Dispose() после этого. Я добавил это. Неизвестный Yahoo, я не вижу консольного окна, вы уверены, что это пакетный файл? Попробуйте установить p.StartInfo.CreateNoWindow = true; –