WaitForExit не захватывает ввод "выхода" - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть следующий метод, как показано ниже, но по какой-то причине WaitForExit () не работает или не распознает предыдущую строку ввода.И это всегда входит в pNpmRun.Kill () часть оператора IF .

Я уже пробовал время ожидания от 0 до 10 минут, стот же результат (не входит в return pNpmRun.StandardOutput.ReadToEnd (); ).Но фактический "$ newman run ..." завершается в течение 3-5 секунд.

Что я также заметил, если вывести результат в файл при ошибке - он имеет другойКонец вывода.

Когда у меня есть следующая часть:

 if (!pNpmRun.WaitForExit(60000))
            {
                File.WriteAllText(@"C:\\Postman\\FailedOutput.log", pNpmRun.StandardOutput.ReadToEnd());
                pNpmRun.Kill();
                throw new TimeoutException("Command didn't complete in 10 minute timeout");
            }

Выход будет иметь следующий конец (там есть слово 'exit' ), и он также скажетэтот процесс уже завершился, когда он дошел до строки .Kill ():

                ... at assertion:0 in test-script                     
                inside "SearchCatalogIndexForNonBatchTracked"     

C:\src\bin\Debug>exit

Но если я переместлю .ReadToEnd () к .Kill (), как показано ниже:

 if (!pNpmRun.WaitForExit(60000))
            {
                pNpmRun.Kill();
                File.WriteAllText(@"C:\\Postman\\FailedOutput.log", pNpmRun.StandardOutput.ReadToEnd());
                throw new TimeoutException("Command didn't complete in 10 minute timeout");
            }

Выход будет иметь следующий конец (не имеет 'exit' ):

                ... at assertion:0 in test-script                     
                inside "SearchCatalogIndexForNonBatchTracked"     

И я не могу понять, почему все это происходит и работает не так, как я ожидаю.

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

        if(!pNpmRun.WaitForExit(600000)) {
             pNpmRun.Kill();
             throw new TimeoutException("Command didn't complete in 10 minute timeout");
         } else {
               return pNpmRun.StandardOutput.ReadToEnd();
         }
}

Я ожидаю, что код почти всегда входит в:

else {
    return pNpmRun.StandardOutput.ReadToEnd();
}
...