通过 C# 控制台执行时如何处理 NPM/Newman 失败/挂起

我有在 C# 中创建的方法(如下所示),它通过 C# 控制台应用程序执行一些 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");

          }

    }


动漫人物
浏览 162回答 1
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),它会抛出一个包含 ExitCode 的异常,以便您知道这两个命令中的哪一个失败了。这依赖于npm和newman进程在失败时返回非零退出代码。那应该处理“失败”。处理“挂起”会更加困难。实际上没有任何方法可以知道该过程是否会返回(阅读:停止问题(我在大学学到的一件事))。
打开App,查看更多内容
随时随地看视频慕课网APP