0

可能重复:
命令提示符输出被读取为空字符串

我有一个命令行程序,它必须至少执行一次,然后我的代码才能做到这一点。所以我用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 窗口上执行此操作时,我能够可靠地诱导包含单词错误的响应。(特别是通过拔掉某些东西。)然而,在相同的条件下,adbResponse字符串仍然是空的。我错过了什么?

4

2 回答 2

2

附加控制台的进程有两个不同的输出流。你在诱捕StandardOutput,但你可能想被捕捉StandardError。请参阅此问题以获得完整的解释(以及安全捕获两者而不会死锁的代码):

命令提示符输出被读取为空字符串

于 2012-07-13T16:58:47.997 回答
0

尝试这样的事情:

p.StartInfo.RedirectStandardOutput = true;
//p.WaitForExit();
StringBuilder value = new StringBuilder();
while ( ! p.HasExited ) {
    value.Append(p.StandardOutput.ReadToEnd());
}
string result = value.ToString();
于 2012-07-13T17:00:52.190 回答