Как справиться с ошибкой / зависанием NPM / Newman при выполнении через консоль C #

#c# #npm #console-application #newman

#c# #npm #консоль-приложение #newman

Вопрос:

У меня есть метод, созданный на C # (как показано ниже), который выполняет несколько команд npm / newman через консольное приложение C #. Текущий код обрабатывает зависание / сбой cmd, но он не обрабатывает случай зависания или сбоя выполнения nmp / newman.

Не могли бы вы помочь с этим?

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

          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");
          }
    }
  

Ответ №1:

Вы можете проверить код выхода ваших npm newman команд и и вернуть их вызывающему процессу:

 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("if not "%ERRORLEVEL%" == "0" exit 1");

        pNpmRun.StandardInput.WriteLine("newman run "  
            ""C:\Postman\Test.postman.json" "  
            "--folder "TestSearch" "  
            "--environment "C:\Postman\postman_environment.json" "  
            "--disable-unicode");

        pNpmRun.StandardInput.WriteLine("if not "%ERRORLEVEL%" == "0" exit 2");
        pNpmRun.StandardInput.WriteLine("exit 0");

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

После каждой команды проверяйте errorlevel , которая является «виртуальной переменной среды», представляющей код выхода предыдущей команды. Если это не было 0 (обычно успешно), то он завершает cmd процесс обратно в ваш код C #. Ваш код C # проверяет ExitCode процесс, и если он не является успешным (0), он выдает исключение, содержащее код выхода, чтобы вы знали, какая из двух команд завершилась с ошибкой. Это зависит от процессов npm и newman , возвращающих ненулевой код выхода при сбое.

Это должно обрабатывать «сбой». Обработка «зависания» была бы более сложной. На самом деле нет никакого способа узнать, вернется ли процесс когда-либо (читайте: проблема с остановкой (единственное, что я узнал в университете)).

Комментарии:

1. Большое спасибо @MarkPflug за пример и подробное объяснение!

2. Извините @MarkPflug, я думаю, мне нужна дополнительная помощь в использовании этого. Если я использую приведенный выше код как есть, VS будет жаловаться на синтаксис для «ERRORLEVEL не существует в текущем контексте», а также на » == «0» exit» как «Синтаксическая ошибка, ‘,’ ожидается»

3. Я пропустил экранирование кавычек. Он должен читать «% ERRORLEVEL%»

4. Спасибо @MarkPflug!