WaitForExit不捕获“退出”输入

时间:2019-04-11 16:19:31

标签: c# .net console-application

我具有以下方法,但是由于某种原因,WaitForExit()无法正常工作或无法识别上一条输入行。并且它总是进入 IF 语句的 pNpmRun.Kill()部分。

我已经尝试了0到10分钟的等待时间,结果相同(不输入 return pNpmRun.StandardOutput.ReadToEnd(); )。但是实际的“ $ newman运行...” 在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'字样),并且还表示Process到达.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");
            }

输出将具有以下结尾(没有“退出” ):

                ... 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();
}

0 个答案:

没有答案