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

我正在尝试执行命令提示符命令并在C#中读取输出。 这是我的代码:

ProcessStartInfo cmdInfo = new ProcessStartInfo("cmd.exe", "/c " + command); cmdInfo.CreateNoWindow = true; cmdInfo.RedirectStandardOutput = true; cmdInfo.UseShellExecute = false; Process cmd = new Process(); cmd.StartInfo = cmdInfo; cmd.Start(); string result = cmd.StandardOutput.ReadToEnd(); cmd.WaitForExit(); cmd.Close(); return result; 

它大部分时间都有效,但有时候结果=“”,这对于我正在使用的命令是不可能的(例如,路由添加应该在成功或失败时给出输出)。 有任何想法吗? 我想知道是否可能在进程和ReadToEnd调用之间创建了竞争条件?

并非所有输出都写入StandardOutput; 如果出现问题,许多应用程序将改为写入StandardError。 您必须从两者中读取才能获得所有输出。

只要应用程序永远不会阻塞输入,就可以安全地在两个输出流上调用ReadToEnd()来获取所有输出。 但是,更安全的选择是将事件与OutputDataReceivedErrorDataReceived事件ErrorDataReceived 。 您可以将lambda表达式附加到关闭局部变量的这些表达式,以使事情变得非常简单:

 var output = new StringBuilder(); var error = new StringBuilder(); cmd.OutputDataReceived += (o, e) => output.Append(e.Data); cmd.ErrorDataReceived += (o, e) => error.Append(e.Data); cmd.Start(); cmd.BeginOutputReadLine(); cmd.BeginErrorReadLine(); cmd.WaitForExit();