我有一个命令行程序,在我的代码执行它之前必须至少执行一次。所以我使用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
字符串仍为空。我错过了什么?
答案 0 :(得分:2)
控制台附加的进程有两个不同的输出流。您正在捕获StandardOutput
,但您可能希望捕获StandardError
。请参阅此问题以获取完整说明(以及安全捕获两者而不会发生死锁的代码):
答案 1 :(得分:0)
尝试类似的东西:
p.StartInfo.RedirectStandardOutput = true;
//p.WaitForExit();
StringBuilder value = new StringBuilder();
while ( ! p.HasExited ) {
value.Append(p.StandardOutput.ReadToEnd());
}
string result = value.ToString();