我正在尝试列出dumpcap.exe可以捕获数据的受支持接口。
我要运行的命令是“dumpcap.exe -D”
在我的系统上,它将输出显示为: -
1. \Device\NPF_{1B627AA8-2A1D-4C90-B560-517CF71B33A5} (Intel(R) 825
Network Connection)
2. \Device\NPF_{7ECC4D31-DF17-49AB-960D-628D0580F3C6} (Microsoft)
我正在尝试通过从WPF C#应用程序运行相同的命令来读取上述输出。我有以下代码: -
Process proc = new Process();
//set the path to dumpcap.exe (verified by me)
proc.StartInfo.FileName = "..\\..\\..\\..\\..\\Dumpcap\\dumpcap.exe";
StringBuilder dumpcapArgs = new StringBuilder();
dumpcapArgs.Append("-D");
proc.StartInfo.Arguments = dumpcapArgs.ToString();
proc.StartInfo.CreateNoWindow = true;
proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
proc.StartInfo.RedirectStandardOutput = true;
proc.StartInfo.UseShellExecute = false;
proc.Start();
while (!proc.StandardOutput.EndOfStream)
{
string line = proc.StandardOutput.ReadLine();
MessageBox.Show(line);
}
当我调试时,执行完全没有进入我的while循环。 StandardOutput已经在流的末尾。进一步深入了解StandardOutput基流类成员,我看到很多System.NotSupportedExceptions的长度,位置等。
上述代码可能出现什么问题?
快速观察
我使用以下代码尝试了另一个示例C#控制台应用程序:
Process proc = new Process();
proc.StartInfo.FileName = "C:\\Karan\\Dumpcap\\dumpcap.exe";
proc.StartInfo.Arguments = "-D";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
Console.WriteLine(proc.StandardOutput.ReadToEnd());
proc.WaitForExit();
按预期打印输出!
但是,如果我尝试在字符串变量中读取standardoutput,我会得到一个空字符串。
例如,这会返回一个空字符串: -
Process proc = new Process();
proc.StartInfo.FileName = "C:\\Karan\\Dumpcap\\dumpcap.exe";
proc.StartInfo.Arguments = "-D";
proc.StartInfo.UseShellExecute = false;
proc.StartInfo.RedirectStandardOutput = true;
proc.Start();
String output = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
答案 0 :(得分:2)
你永远不会开始这个过程。您应该使用proc.Start();
Length
,Position
和Stream
的类似成员不受支持,因为代表控制台应用程序标准的流的长度未知且仅向前流。这是正常的,而不是代码中的错误。
答案 1 :(得分:2)
您是否已将EnableRaisingEvents
设为true
?
我不确定这是否会起作用,因为我通常以不同的方式重定向输出:
private Process proc;
private string procOutput = string.Empty;
private void StartProc()
{
this.procOutput = string.Empty;
this.proc = new Process();
...
this.proc.StartInfo.UseShellExecute = false;
this.proc.StartInfo.CreateNoWindow = true;
this.proc.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
this.proc.EnableRaisingEvents = true;
this.proc.OutputDataReceived += this.ProcOutputDataReceivedHandler;
this.proc.Exited += this.ProcExitedHandler;
this.proc.Start();
this.proc.BeginOutputReadLine();
}
private void ProcOutputDataReceivedHandler(object sendingProcess, DataReceivedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Data))
{
this.procOutput += e.Data;
}
}
private void ProcExitedHandler(object sender, EventArgs e)
{
// Check the exitcode for possible errors happened during execution.
MessageBox.Show(this.procOutput);
}
答案 2 :(得分:0)
试试这个:
string output = proc.StandardOutput.ReadToEnd();
proc.WaitForExit();
foreach(var line in output.Split('\r'))
{
MessageBox.Show(line);
}
为什么这样做?当您第一次查询EndOfStream时,输出流中可能没有任何内容。这是竞争条件。
我在发帖前咨询了这篇文章。给它一个阅读http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput.aspx