#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!