Если вам на самом деле необязательно нужно, чтобы шаги выполнялись в одном и том же процессе, а только последовательно, вы можете использовать метод «WaitForExit» в Process, который будет блокировать выполнение в текущем потоке до завершения процесса. Например, следующий код откроет блокнот, подождет, пока вы его закроете (процесс завершится), а затем откроет второй экземпляр блокнота:
p.StartInfo.FileName = "notepad.exe";
p.Start();
p.WaitForExit();
p.Close();
p.StartInfo.FileName = "notepad.exe";
p.Start();
p.WaitForExit();
p.Close();
Однако эти два экземпляра будут происходить в разных процессах - это можно увидеть, например, проверив PID notepad.exe в диспетчере задач.
Если вы действительно хотите запустить несколько программ CLI в одном и том же процессе, вы можете просто открыть процесс, выполняющий «cmd.exe», и передавать ему команды через его StandardInput. Поток StandardInput - это поток, из которого программа считывает свои входные данные - в случае cmd.exe это так же, как если бы вы вводили эти команды непосредственно в него. Например, попробуйте это:
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.Start();
p.StandardInput.WriteLine("echo Hello there!");
p.StandardInput.WriteLine("dir");
p.StandardInput.WriteLine("echo Goodbye!");
p.WaitForExit();
p.Close();
Одной из проблем этого подхода является то, что вы не знаете, действительно ли последняя команда, которую вы передали, действительно выполнила это легко ... вызов WaitForExit будет ждать, пока процесс завершится сам по себе, но в случай окна cmd.exe, которое потребует от пользователя прийти и нажать «X» в углу. Вы можете пропустить вызов WaitForExit, но это может прервать процесс, пока ваша последняя команда еще что-то делает.
К счастью, в данном конкретном случае cmd.exe завершит свою работу, если вы введете команду «exit»:
Process p = new Process();
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.Start();
p.StandardInput.WriteLine("echo Hello there!");
p.StandardInput.WriteLine("dir");
p.StandardInput.WriteLine("echo Goodbye!");
p.StandardInput.WriteLine("exit");
p.WaitForExit();
p.Close();
По ходу дела вы должны установить для свойств UseShellExecute и RedirectStandardInput значения true и false соответственно, либо использование потока StandardInput вызовет исключение того или иного типа - попробуйте и посмотрите! Подробнее об этом можно прочитать здесь:
http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardinput.aspx