Хранить консольное окно нового процесса открытым после его завершения

В настоящее время у меня есть часть кода, которая создает новый процесс и выполняет его из оболочки.

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();