Как отправить серию команд процессу командной строки? - PullRequest
9 голосов
/ 25 января 2011

У нас есть несколько команд (командные файлы / исполняемые файлы) в нашем сетевом пути, которые мы должны вызвать, чтобы инициализировать нашу «среду разработки» для этого командного окна.Он устанавливает некоторые переменные окружения, добавляет материал в Path и т. Д. (Тогда распознаются только те рабочие команды, которые мы вводим, и я не знаю, что входит в эти команды инициализации)

Теперь моя проблема в том,чтобы вызывать серию этих «рабочих команд» с помощью программы на C #, и, конечно, они будут работать только после первоначальной настройки.Как я могу это сделать?В настоящее время я создаю пакетный файл с нуля из программы, например, такой:

file.Writeline("InitializationStep1.bat")
file.Writeline("InitializeStep2.exe")
file.Writeline("InitializeStep3.exe")

Затем действительные команды

file.Writeline("Dowork -arguments -flags -blah -blah")
file.Writeline("DoMoreWork -arguments -flags -blah -blah")

Затем, наконец, закройте средство записи файлов и запуститеэтот пакетный файл.

Теперь, если я выполню это напрямую, используя Process.<strike>Run</strike>Start("cmd.exe","Dowork -arguments");, оно не запустится.

Как мне добиться этого более чистым способом, чтобы мне пришлось запускать команды инициализации только один раз?(Я могу запускать cmd.exe каждый раз со всеми тремя инициализаторами, но они занимают много времени, поэтому я хочу сделать это только один раз)

Ответы [ 2 ]

15 голосов
/ 25 января 2011

Как отметил @Hakeem, System.Diagnostic.Process не имеет статического Run метода.Я думаю, что вы имеете в виду метод Start.
После того, как вы завершили сборку командного файла, просто запустите его, используя следующий код:

Process p = new Process();
p.StartInfo.FileName = batchFilePath;
p.StartInfo.Arguments = @"-a arg1 -b arg2";
p.Start();

Обратите внимание, что символ @ должен иметь префикс к строке аргумента, поэтомусимволы escape-последовательности, такие как \, рассматриваются как литералы.

Альтернативный код

Process.Start(batchFilePath, @"-a arg1 -b arg2");

или

ProcessStartInfo processStartInfo = new ProcessStartInfo();
processStartInfo.FileName = batchFilePath;
processStartInfo.Arguments = @"-a arg1 -b arg2";
Process.Start(processStartInfo);


Дополнительная информация

Пример многокомандного командного файла

dir /O
pause
dir
pause

Сохранить этот файл как.bat, а затем выполнить с помощью метода Start.В этом случае вы можете указать аргумент с командой в самом пакетном файле (в приведенном выше примере для команды dir указана опция /O.
Я полагаю, вы уже выполнили часть создания пакетного файла), теперь просто добавьте аргументы к командам в пакетном файле.

Перенаправление ввода в процесс
Поскольку вы хотите отправить несколько команд одному и тому же процессу cmd, вы можете перенаправитьстандартный ввод процесса для получения ввода от вашей программы, а не от клавиатуры.

Код основан на аналогичном вопросе по адресу: Выполните несколько командных строк с одинаковымипроцесс с использованием C #

private string ProcessRunner()
{
    ProcessStartInfo processStartInfo = new ProcessStartInfo("cmd.exe");
    processStartInfo.RedirectStandardInput = true;
    processStartInfo.RedirectStandardOutput = true;
    processStartInfo.UseShellExecute = false;

    Process process = Process.Start(processStartInfo);

    if (process != null)
    {
        process.StandardInput.WriteLine("dir");
        process.StandardInput.WriteLine("mkdir testDir");
        process.StandardInput.WriteLine("echo hello");
        //process.StandardInput.WriteLine("yourCommand.exe arg1 arg2");

        process.StandardInput.Close(); // line added to stop process from hanging on ReadToEnd()

        string outputString = process.StandardOutput.ReadToEnd();
        return outputString;
    }

    return string.Empty;
}

Метод возвращает выходные данные выполнения команды. Аналогичным образом можно также перенаправить и прочитать поток StandardOuput процесса.

0 голосов
/ 25 января 2011

Метод Process.Run, который вы упомянули, относится к классу Process в пространстве имен System.Diagnostics?AFAIK, тип Process не имеет статического метода или метода экземпляра с именем Run.Если вы еще этого не сделали, я бы попробовал использовать метод Start для Process, экземпляр или статический

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