我正在开发一个应用程序,该应用程序调用多个命令行应用程序以对某些视频文件进行一些后期处理。
现在,我正尝试使用Comskip来识别来自有线卡调谐器的视频录制中的商业广告。这运行得很好,但是我在获取所需的屏幕输出时遇到问题。
String stdout = null;
using (var process = new Process())
{
var start = new ProcessStartInfo(comskip, cmdLine);
start.WindowStyle = ProcessWindowStyle.Normal;
start.CreateNoWindow = true;
start.UseShellExecute = false;
start.RedirectStandardOutput = true;
process.StartInfo = start;
process.Start();
process.WaitForExit();
stdout = process.StandardOutput.ReadToEnd();
}
我希望
stdout
能够抓取屏幕上显示的内容,与手动启动该应用程序时(以下屏幕截图)相同,这是应用程序正在执行的连续提要,并且在输出中混合的行进度百分比,我想用它来更新进度条但是运行上面的代码只会给我:
使用的命令行是:
“ C:\ Users \ Chris \ Google Drive \ Tools \ ComSkip \ comskip.exe”“ C:\ Users \ Chris \ Desktop \ ComSkip Tuning Files \ Modern Family.wtv”“ --ini = C:\ Users \ Chris \ Desktop \ ComSkip Tuning Files \ comskip_ModernFamily.ini“
根据命令行将ini文件设置为C:\ Users \ Chris \ Desktop \ ComSkip Tuning Files \ comskip_ModernFamily.ini
使用C:\ Users \ Chris \ Desktop \ ComSkip Tuning Files \ comskip_ModernFamily.ini作为初始值。
我还尝试了重定向
StandardError
流并获取process.StandardError.ReadToEnd();
,但是如果使用这些选项运行,则该过程似乎挂起。我是否缺少某些内容来捕获我的期望,或者此应用程序的输出流可能会流向其他无法访问的地方?
最佳答案
您必须设置以下内容:
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.UseShellExecute = false;
process.OutputDataReceived += new DataReceivedEventHandler(ReadOutput);
process.ErrorDataReceived += new DataReceivedEventHandler(ErrorOutput);
process.Start();
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
并在
ReadOutput
和ErrorOutput
中捕获输出 private static void ErrorOutput(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
stdout = "Error: " + e.Data;
}
}
private static void ReadOutput(object sender, DataReceivedEventArgs e)
{
if (e.Data != null)
{
stdout = e.Data;
}
}
关于c# - 从Process.Start()获取所需输出时出现问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14094771/