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

时间:2012-07-13 16:54:12

标签: c# cmd

  

可能重复:
  Command prompt output being read as empty string

我有一个命令行程序,在我的代码执行它之前必须至少执行一次。所以我使用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的响应。 (特别是通过拔掉某些东西。)但是在相同条件下,adbResponse字符串仍为空。我错过了什么?

2 个答案:

答案 0 :(得分:2)

控制台附加的进程有两个不同的输出流。您正在捕获StandardOutput,但您可能希望捕获StandardError。请参阅此问题以获取完整说明(以及安全捕获两者而不会发生死锁的代码):

Command prompt output being read as empty string

答案 1 :(得分:0)

尝试类似的东西:

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