我正在尝试在cmd.exe中运行命令,并将输出重定向到文本文件。我已经验证了该命令正在执行,但是当我调用StandardOutput.ReadToEnd()或StandardError.ReadToEnd()时,将返回一个空字符串而不是该命令的文本输出。我错过了什么吗?
ProcessStartInfo PSI = new ProcessStartInfo("cmd.exe", command);
PSI.UseShellExecute = false;
PSI.CreateNoWindow = true;
PSI.RedirectStandardInput = true;
PSI.RedirectStandardOutput = true;
PSI.RedirectStandardError = true;
PSI.Arguments = "/c";
var proc = Process.Start(PSI);
proc.WaitForExit();
string output = proc.StandardOutput.ReadToEnd();
Console.WriteLine(output);
string errors = proc.StandardError.ReadToEnd();
Console.WriteLine(errors);
答案 0 :(得分:1)
如果您同时也在捕获错误输出,我非常确定使用TimeoutException
无法正常工作。您需要使用proc.BeginOutputReadLine()
代替(和ReadToEnd
进行错误输出)。
但是,这些方法是异步的,因此您需要使用事件处理程序来实际获取输出。
proc.BeginErrorReadLine()
处理程序将输出/错误数据存储在事件参数的PSI.EnableRaisingEvents = true;
proc.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(OutputReceivedHandler);
proc.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(ErrorReceivedHandler);
属性中。
Data
由于这一切都是异步的,因此您希望放弃private void OutputReceivedHandler(object sender, DataReceivedEventArgs e)
{
Console.WriteLine(e.Data);
}
private void ErrorReceivedHandler(object sender, ErrorReceivedEventArgs e)
{
Console.WriteLine(e.Data);
}
调用,因为这会不必要地阻止。如果您执行希望调用阻止,则可以使用WaitForExit
,但请参阅the answer that user Greg linked in the comments以获取不会导致缓冲区溢出的实现。