Я хочу запустить cmd-файл и сразу же получить результат.Перенаправление вывода процесса
Посмотрите на мой код. Заключение process.WaitForExit()
не ждет; почему нет? copyf.cmd
работает нормально, если я не запускаю его в скрытом режиме, потому что показанный dosbox работает до конца cmd. В скрытом режиме cmd закрыт, потому что process.WaitForExit()
doen't wiat до завершения cmd.
public void doSomeThing( Queue<string> output, // queue for output log
Queue<string> error // queue for error log
)
{
String com = "some params";
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.FileName = Properties.Settings.Default.pathTo + @"\Make\copyf.cmd";
startInfo.Arguments = com;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
process.StartInfo = startInfo;
Thread thread = new Thread(new ThreadStart(() =>
{
String er;
String outp;
while (true)
{
outp = process.StandardOutput.ReadLine();
if(outp != null)
output.Enqueue("Output :" + outp + "\n");
er = process.StandardError.ReadLine();
if (er != null)
error.Enqueue("Error :" + er + "\n");
}
}));
process.Start();
thread.Start();
process.WaitForExit();
}
Почему вы вычисляете 'WaitForExit' не ждать, пока процесс выхода? – Ryan
Я нашел '.WaitForExit()' не работает cross threaded, вместо этого я полагаю, что использовал 'while (! Proc.HasExited)' (фигурировал скорее комментарий, чем ответ) – Sayse
ну, его не перекрестная резьба , поток только считывает вывод/ошибку. «process» запускается в том же процессе, в котором обрабатывается process.WaitForExit (9). – tux007