C# 如何在进程中获取使用cmd.exe发出的命令的响应?

C# 如何在进程中获取使用cmd.exe发出的命令的响应?,c#,cmd,C#,Cmd,可能重复: 我有一个命令行程序,在代码执行groovy thang之前,必须至少执行一次。所以我使用Process来运行它。这似乎有效 我的问题在于,我希望能够看到程序在完成时所说的话。在某些情况下,它可能会返回错误,这需要用户在继续之前进行干预。从纸面上看,这似乎微不足道。遗憾的是,我的代码(如下)似乎不起作用: Process p = new Process(); ProcessStartInfo startInfo = new System.Diagnostics.ProcessStar

可能重复:

我有一个命令行程序,在代码执行groovy thang之前,必须至少执行一次。所以我使用
Process
来运行它。这似乎有效

我的问题在于,我希望能够看到程序在完成时所说的话。在某些情况下,它可能会返回错误,这需要用户在继续之前进行干预。从纸面上看,这似乎微不足道。遗憾的是,我的代码(如下)似乎不起作用:

Process p = new Process();
ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
startInfo.CreateNoWindow = true;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = String.Format("/C adb forward tcp:{0} tcp:5574",port.ToString());
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
p.StartInfo = startInfo;
p.Start();
string adbResponse = p.StandardOutput.ReadToEnd();
p.WaitForExit();
if (adbResponse.Contains("error"))
{
    // Device not connected - complain loudly
}

当我尝试在自己创建的CMD窗口上执行此操作时,我能够可靠地诱导包含单词error的响应。(特别是拔下插头。)但是,在相同的条件下,
adbr响应
字符串保持为空。我缺少什么?

控制台连接的进程有两个不同的输出流。您正在捕获
StandardOutput
,但可能希望捕获
StandardError
。请参阅此问题以获得完整的解释(以及在无死锁的情况下安全捕获两者的代码):


试试这样的方法:

p.StartInfo.RedirectStandardOutput = true;
//p.WaitForExit();
StringBuilder value = new StringBuilder();
while ( ! p.HasExited ) {
    value.Append(p.StandardOutput.ReadToEnd());
}
string result = value.ToString();

@MichaelEdenfield道歉-它看起来确实是一个完全相同的副本。没问题;当您投票以欺骗方式结束某个问题时,评论将自动进行。