无法使用 process.ErrorDataReceived c# 获取过程错误输出
cant get process error output using process.ErrorDataReceived c#
我构建了 Form
我使用了一段时间的应用程序,现在我想捕捉我的进程的 StandardError
及其 standartOutput
我看过 SO 和 MSDN 中的答案,但还是无法正确回答
我的代码:
public void RunProcess(string FileName, string Arguments,, bool IsPrintOutput = true)
{
process = new Process();
process.ErrorDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent);
if (IsPrintOutput) process.OutputDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent);
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.FileName = FileName;
process.StartInfo.Arguments = Arguments;
if (EventWhenExit)
{
process.EnableRaisingEvents = true;
process.Exited += new EventHandler(myprocess_Exited);
}
process.Start();
process.BeginOutputReadLine();
//run polling on stored logs to print them to screen
PollingService();
}
我已经用 Iperf 检查了它,我发现当我 运行 使用正确的参数时,我得到 正确的输出
但是当我发送它时没有任何 argumnet 我看到用 cmd 我得到
C:\>iperf.exe
Usage: iperf [-s|-c host] [options]
Try `iperf --help' for more information.
而我的应用程序却一无所获!
我在这里错过了什么?
谢谢
您可以在这里停止阅读!如果您想查看内部方法的详细信息,请继续下面的操作:
private void OnDataReceivedEvent(object sender, DataReceivedEventArgs e)
{
string ProcessOutput = e.Data;
ProcessLog.Add(e.Data);
}
private void PollingService()
{
var T = new Thread (()=>
{
while (true /* ProcessRunning*/)
{
if (ProcessLogIndex < ProcessLog.Count)
{
lock (this)
{
var tempList = ProcessLog.GetRange(ProcessLogIndex, ProcessLog.Count - ProcessLogIndex);
ProcessLogIndex = ProcessLog.Count;
foreach (var ToSend in tempList)
{
onDataOutputFromProcess(this, ToSend, sProcessNameID.ToString());
}
}
}
Thread.Sleep(400);
}
});
T.IsBackground = true;
T.Start();
}
我在您发布的代码中的任何地方都没有看到对 BeginErrorReadLine()
的调用。如果您不调用该方法,那么 Process
class 实际上不会将 stderr 重定向到您的事件处理程序。
我相信以上就是问题所在,但如果你真的在某处调用它(只是没有显示),那么值得考虑的是,那里有一些奇怪的控制台程序实际上并没有使用 stderr(或 stdout)进行错误输出。相反,他们直接写入控制台 window 或其他一些非标准机制。在这些情况下,您将无法通过重定向 stderr 来接收错误输出。
您可以通过在命令中重定向它们的输出来识别这些程序,例如iperf.exe 2> foo.txt
。 stderr 文件句柄是 2
,因此该语法将该文件句柄重定向到名为 foo.txt
的文件。如果文件为空并且您在屏幕上看到错误,则该程序就是那些奇怪的程序之一。
但说真的,我想你可能只是忘了打电话给 BeginErrorReadLine()
。 :)
我构建了 Form
我使用了一段时间的应用程序,现在我想捕捉我的进程的 StandardError
及其 standartOutput
我看过 SO 和 MSDN 中的答案,但还是无法正确回答
我的代码:
public void RunProcess(string FileName, string Arguments,, bool IsPrintOutput = true)
{
process = new Process();
process.ErrorDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent);
if (IsPrintOutput) process.OutputDataReceived += new DataReceivedEventHandler(OnDataReceivedEvent);
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.RedirectStandardError = true;
process.StartInfo.CreateNoWindow = true;
process.StartInfo.UseShellExecute = false;
process.StartInfo.FileName = FileName;
process.StartInfo.Arguments = Arguments;
if (EventWhenExit)
{
process.EnableRaisingEvents = true;
process.Exited += new EventHandler(myprocess_Exited);
}
process.Start();
process.BeginOutputReadLine();
//run polling on stored logs to print them to screen
PollingService();
}
我已经用 Iperf 检查了它,我发现当我 运行 使用正确的参数时,我得到 正确的输出 但是当我发送它时没有任何 argumnet 我看到用 cmd 我得到
C:\>iperf.exe
Usage: iperf [-s|-c host] [options]
Try `iperf --help' for more information.
而我的应用程序却一无所获!
我在这里错过了什么? 谢谢
您可以在这里停止阅读!如果您想查看内部方法的详细信息,请继续下面的操作:
private void OnDataReceivedEvent(object sender, DataReceivedEventArgs e)
{
string ProcessOutput = e.Data;
ProcessLog.Add(e.Data);
}
private void PollingService()
{
var T = new Thread (()=>
{
while (true /* ProcessRunning*/)
{
if (ProcessLogIndex < ProcessLog.Count)
{
lock (this)
{
var tempList = ProcessLog.GetRange(ProcessLogIndex, ProcessLog.Count - ProcessLogIndex);
ProcessLogIndex = ProcessLog.Count;
foreach (var ToSend in tempList)
{
onDataOutputFromProcess(this, ToSend, sProcessNameID.ToString());
}
}
}
Thread.Sleep(400);
}
});
T.IsBackground = true;
T.Start();
}
我在您发布的代码中的任何地方都没有看到对 BeginErrorReadLine()
的调用。如果您不调用该方法,那么 Process
class 实际上不会将 stderr 重定向到您的事件处理程序。
我相信以上就是问题所在,但如果你真的在某处调用它(只是没有显示),那么值得考虑的是,那里有一些奇怪的控制台程序实际上并没有使用 stderr(或 stdout)进行错误输出。相反,他们直接写入控制台 window 或其他一些非标准机制。在这些情况下,您将无法通过重定向 stderr 来接收错误输出。
您可以通过在命令中重定向它们的输出来识别这些程序,例如iperf.exe 2> foo.txt
。 stderr 文件句柄是 2
,因此该语法将该文件句柄重定向到名为 foo.txt
的文件。如果文件为空并且您在屏幕上看到错误,则该程序就是那些奇怪的程序之一。
但说真的,我想你可能只是忘了打电话给 BeginErrorReadLine()
。 :)