Хранить консольное окно нового процесса открытым после его завершения
В настоящее время у меня есть часть кода, которая создает новый процесс и выполняет его из оболочки.
Process p = new Process();
...
p.Start();
p.WaitForExit();
Это держит окно открытым во время процесса, что отлично. Тем не менее, я также хочу оставить окно открытым после того, как оно закончится, чтобы просмотреть потенциальные сообщения. Есть ли способ сделать это?
Ответы
Ответ 1
Это откроет оболочку, запустит ваш исполняемый файл и оставит окно оболочки открытым после завершения процесса.
Process p = new Process();
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "CMD.EXE";
psi.Arguments = "/K yourmainprocess.exe";
p.StartInfo = psi;
p.Start();
p.WaitForExit();
или просто
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "CMD.EXE";
psi.Arguments = "/K yourmainprocess.exe";
Process p = Process.Start(psi);
if(p != null && !p.HasExited)
p.WaitForExit();
Ответ 2
Легче просто захватить вывод как из StandardOutput, так и из StandardError, сохранить каждый вывод в StringBuilder и использовать этот результат, когда процесс будет завершен.
var sb = new StringBuilder();
Process p = new Process();
// redirect the output
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.RedirectStandardError = true;
// hookup the eventhandlers to capture the data that is received
p.OutputDataReceived += (sender, args) => sb.AppendLine(args.Data);
p.ErrorDataReceived += (sender, args) => sb.AppendLine(args.Data);
// direct start
p.StartInfo.UseShellExecute=false;
p.Start();
// start our event pumps
p.BeginOutputReadLine();
p.BeginErrorReadLine();
// until we are done
p.WaitForExit();
// do whatever you need with the content of sb.ToString();
Вы можете добавить дополнительное форматирование в инструкции sb.AppendLine
чтобы различать стандартный вывод и вывод ошибок, например: sb.AppendLine("ERR: {0}", args.Data);
Ответ 3
Относительно: "Член Process.Start(ProcessStartInfo) не может быть доступен с помощью ссылки на экземпляр; вместо этого укажите его с помощью имени типа"
Это решило проблему для меня....
ProcessStartInfo psi = new ProcessStartInfo();
psi.FileName = "CMD.EXE";
psi.Arguments = "/K yourmainprocess.exe";
Process p = Process.Start(psi);
p.WaitForExit();
Ответ 4
Будьте осторожны с ключом /k, потому что во многих примерах обычно используется /c.
Команда запуска CMD/K и затем вернитесь к приглашению CMD.
Команда запуска CMD/C, а затем завершить
var p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = "/k yourmainprocess.exe";
p.Start();
p.WaitForExit();