2

我正在尝试列出 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();

这将按预期打印输出!

但是,如果我尝试读取字符串变量中的标准输出,我会得到一个空字符串。

例如,这会返回一个空字符串:-

       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();
4

3 回答 3

2

你设置EnableRaisingEventstrue吗?

我不确定这是否能解决问题,因为我通常以不同的方式重定向输出:

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);
}
于 2013-09-23T11:15:59.260 回答
2

你永远不会开始这个过程。你应该这样做使用proc.Start();

Length,Position和 的类似成员Stream不受支持,因为代表控制台应用程序的标准的流的长度未知且仅向前流。所以这是正常的,而不是您的代码中的错误。

于 2013-09-23T10:14:27.603 回答
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

于 2013-09-23T10:46:53.160 回答