![](/img/trans.png)
[英]OAuth 2.0 Mailkit “Authentication failed” in MVC, but c# console-app works fine
[英]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.