Попробуйте записать команду 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");
}