Подражая пакетному файлу с C # с ограничением - PullRequest
2 голосов
/ 15 февраля 2011

Я задал вопрос Мимический пакетный файл с C # и получил несколько хороших ответов

Но проблема в том, что эти три команды должны выполняться в одном и том же процессе.

vsperfcmd /start:coverage /output:run.coverage
hello
vsperfcmd /shutdown

Итак, метод Process.Start

Process.Start("vsperfcmd", "/start:coverage /output:run.coverage");
Process.Start("hello");
Process.Start("vsperfcmd", "/shutdown");

не должен работать, поскольку он запускает три процесса независимо друг от друга.

Есть ли другой способ запустить эти три команды в одном процессе? Я имею в виду, бегать один за другим.

Ответы [ 3 ]

2 голосов
/ 15 февраля 2011

Если вам на самом деле необязательно нужно, чтобы шаги выполнялись в одном и том же процессе, а только последовательно, вы можете использовать метод «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

1 голос
/ 15 февраля 2011

Похоже, вы могли бы использовать System.Diagnostics.Process ()

var proc = new System.Diagnostics.Process();
proc.EnableRaisingEvents=false;
proc.StartInfo.FileName="vsperfcmd";
proc.StartInfo.Arguments="/start:coverage /output:run.coverage";
proc.Start();
proc.WaitForExit();

var proc2 = new System.Diagnostics.Process();
proc2.EnableRaisingEvents=false;
proc2.StartInfo.FileName="hello";
proc2.StartInfo.Arguments="";
proc2.Start();
proc2.WaitForExit();

var proc3 = new System.Diagnostics.Process();
proc3.EnableRaisingEvents=false;
proc3.StartInfo.FileName="vsperfcmd";
proc3.StartInfo.Arguments="/shutdown";
proc3.Start();
proc3.WaitForExit();
0 голосов
/ 15 февраля 2011

Если запуск командного файла напрямую не соответствует вашим потребностям, я полагаю, что вы можете открыть консоль из c # и отправить ей команду, как только вы захватили стандартный ввод консоли.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...