为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
动漫人物 2022-12-04 11:12:50
我有在 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");          }    }
查看完整描述

1 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

您可以检查您的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进程在失败时返回非零退出代码。


那应该处理“失败”。处理“挂起”会更加困难。实际上没有任何方法可以知道该过程是否会返回(阅读:停止问题(我在大学学到的一件事))。


查看完整回答
反对 回复 2022-12-04
  • 1 回答
  • 0 关注
  • 160 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信