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

问题描述 投票:1回答:1

我有在C#中创建的方法(如下所示),它通过C#console-app执行一些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");
          }
    }
c# npm console-application newman
1个回答
1
投票

您可以检查npmnewman命令的退出代码,并将它们返回给调用进程:

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的异常,因此您知道这两个命令中的哪一个失败。这依赖于npmnewman进程在失败时返回非零退出代码。

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

© www.soinside.com 2019 - 2024. All rights reserved.