簡體   English   中英

通過C#console-app執行一些命令

[英]Execute a few commands via C# console-app

我是C#的新手(並且是開發人員)。 我需要用C#編寫一個方法,該方法將通過控制台執行以下操作: -執行郵遞員運行。

我創建了一個如下所示的方法(我嘗試了2個選項:ReadToEnd和WaitForExit),但是它似乎卡在了每個步驟中。

有什么幫助如何使它依次執行兩個命令(第一個需要在第二個開始之前完成)並在第二個命令完全執行后退出?

提前致謝。

    public string Runner ()
    {
        string readOutput = null;
        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.WaitForExit();
        //pNpmRun.StandardOutput.ReadToEnd();
        pNpmRun.StandardInput.WriteLine($"newman run " +
            $"\"C:\\Postman\\Test.postman.json\" " +
            $"--folder \"TestSearch\" " +
            $"--environment \"C:\\Postman\\postman_environment.json\" " +
            $"--disable-unicode");
        pNpmRun.StandardOutput.ReadToEnd();
        pNpmRun.WaitForExit();
        return readOutput = pNpmRun.StandardOutput.ReadLine();
    }

嘗試將exit命令寫入cmd輸入流。

問題在於,您發送的命令(npm,newman)正在執行,然后控制權返回到外殼程序(cmd),然后外殼程序正在等待發送更多用戶輸入。 您需要通過發送“退出”來告訴它退出。 您應該只有1個WaitForExit調用。 WaitForExit正在等待cmd進程退出,而不是等待發送給它的單個命令。

接下來,你應該將ReadToEnd進程退出 (后WaitForExit )。 這是一個關於為什么的問題: 進程和waitforexit的std輸出中的ReadToEnd

因此,如下所示:

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");

        pNpmRun.WaitForExit();
        return pNpmRun.StandardOutput.ReadToEnd();

您也可以考慮將超時添加到WaitForExit。 如果這些cmds由於某種原因而卡住,則您的調用過程也將因等待它們完成而卡住。 通常最好最終失敗,而不是擁有一堆掛起的進程。 如果超時到期,則可以終止該進程。

  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");
  }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM