处理C#中的标准输出返回空字符串

时间:2013-09-23 10:11:57

标签: c# process

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

3 个答案:

答案 0 :(得分:2)

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

执行此操作

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

答案 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