亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

通過 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 關注
  • 197 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號