Выполните несколько команд через консольное приложение C # - PullRequest
2 голосов
/ 09 апреля 2019

Я новичок в C # (и разработке в целом). Мне нужно написать метод в C #, который будет выполнять следующее через консоль: - установить Newman; - выполнить почтальон Беги.

Я создал метод, описанный ниже (я попробовал 2 варианта: ReadToEnd и WaitForExit), но, похоже, он застрял на каждом из этих шагов.

Любая помощь, как заставить это выполнить обе команды в последовательности (1-ая должна закончиться до 2-го запуска) и выйти после полной 2-ой команды?

Заранее спасибо.

    public string Runner ()
    {
        string readOutput = null;
        var psiNpm = new ProcessStartInfo
        {
            FileName = "cmd",
            RedirectStandardOutput = true,
            RedirectStandardInput = true,
            UseShellExecute = false
        };
        var pNpmRun = Process.Start(psiNpm);
        pNpmRun.StandardInput.WriteLine($"npm install -g newman");
        pNpmRun.WaitForExit();
        //pNpmRun.StandardOutput.ReadToEnd();
        pNpmRun.StandardInput.WriteLine($"newman run " +
            $"\"C:\\Postman\\Test.postman.json\" " +
            $"--folder \"TestSearch\" " +
            $"--environment \"C:\\Postman\\postman_environment.json\" " +
            $"--disable-unicode");
        pNpmRun.StandardOutput.ReadToEnd();
        pNpmRun.WaitForExit();
        return readOutput = pNpmRun.StandardOutput.ReadLine();
    }

1 Ответ

3 голосов
/ 09 апреля 2019

Попробуйте записать команду exit во входной поток cmd.

Проблема в том, что команды, которые вы отправили (npm, newman), выполняются, а затем управление возвращается в оболочку (cmd), который затем ждет, пока пользовательский ввод будет отправлен.Вы должны сказать ему, чтобы выйти, отправив «выход».У вас должен быть только 1 вызов WaitForExit.WaitForExit ожидает завершения процесса cmd, а не отдельных команд, которые вы ему отправляете.

Далее следует переместить ReadToEnd после процесса (после *).1011 *).Вот вопрос о том, почему: ReadToEnd из вывода std процесса и waitforexit

Итак, что-то вроде этого:

public string Runner ()
    {
        var psiNpm = new ProcessStartInfo
        {
            FileName = "cmd",
            RedirectStandardOutput = true,
            RedirectStandardInput = true,
            UseShellExecute = false
        };
        var pNpmRun = Process.Start(psiNpm);
        pNpmRun.StandardInput.WriteLine("npm install -g newman");
        pNpmRun.StandardInput.WriteLine("newman run " +
            "\"C:\\Postman\\Test.postman.json\" " +
            "--folder \"TestSearch\" " +
            "--environment \"C:\\Postman\\postman_environment.json\" " +
            "--disable-unicode");
        pNpmRun.StandardInput.WriteLine("exit");

        pNpmRun.WaitForExit();
        return pNpmRun.StandardOutput.ReadToEnd();

Вы также можете рассмотреть возможность добавления тайм-аута дляWaitForExit.Если эти команды по какой-то причине застряли, ваш вызывающий процесс также застрянет, ожидая их завершения.Обычно лучше в конечном итоге потерпеть неудачу, чем иметь кучу зависших процессов.Затем вы можете завершить процесс, если истечет время ожидания.

  var tenMin = 10 * 60 * 1000;
  if(pNpmRun.WaitForExit(tenMin)) {
    return pNpmRun.StandardOutput.ReadToEnd();
  } else {
    pNpmRun.Kill();
    throw new TimeoutException("Command didn't complete in 10 minute timeout");
  }

...