У меня есть метод, созданный на С# (как показано ниже), который выполняет несколько команд npm/newman через консольное приложение С#. Текущий код обрабатывает, если 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");
}
}
Вы можете проверить код выхода ваших команд 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), он выдает исключение, содержащее ExitCode, чтобы вы знали, какая из двух команд не удалась. Это основано на том, что процессы npm
и newman
возвращают ненулевой код выхода в случае сбоя.
Это должно обрабатывать "сбой". Обработка «зависания» будет более сложной. На самом деле нет никакого способа узнать, вернется ли процесс когда-либо (читай: проблема остановки (единственная вещь, которую я узнал в университете)).
Извините, @MarkPflug, думаю, мне нужна дополнительная помощь в использовании этого. Если я использую приведенный выше код как есть, тогда VS будет жаловаться на синтаксис для «ERRORLEVEL не существует в текущем контексте», а также на «== «0» выход» как «Синтаксическая ошибка, ',' ожидал"
Я пропустил экранирование кавычек. Должно быть написано \"%ERRORLEVEL%\"
Спасибо @MarkPflug!
Большое спасибо @MarkPflug за пример и подробное объяснение!