从过程中获取值StandardOutput(Get Values from Process Stan

2019-07-20 09:02发布

我试图让输出显示在我的机器上当前打开的文档,但它回来NULL不管。

StringCollection values = new StringCollection();
var proc = new Process
{
     StartInfo = new ProcessStartInfo
     {
          FileName = "openfiles.exe",
          Arguments = "/query /FO CSV /v",
          UseShellExecute = false,
          RedirectStandardOutput = true,
          CreateNoWindow = true
     }
};
proc.Start();
while (!proc.StandardOutput.EndOfStream)
{
     string line = proc.StandardOutput.ReadLine();
     values.Add(line);
}
foreach (string sline in values)
MessageBox.Show(sline);

编辑:

在进一步审查我看到,我得到一个异常的问题。 在我的诊断来看,我得到如下:Proc.BasePriority THRE类型System.InvalidOperationException的一个例外

编辑:

想抽出代码:

string val = proc.StandardOutput.ReadToEnd();
MessageBox.Show(val);

同样在返回NULL值,和PROC仍然有错误,甚至proc.start后();.

Answer 1:

你必须同时读取的标准输出和标准错误流。 这是因为你不能在同一个线程读取他们。

要做到这一点,你必须使用事件处理器将在一个单独的线程调用。

编译代码作为anycpuopenfiles采用的是32位和64位变体。 如果有一个结构不匹配它可能找不到可执行文件。

这是从错误流中读取这些行被用! >让他们脱颖而出的输出。

    StringCollection values = new StringCollection();
    var proc = new Process
    {
        StartInfo = new ProcessStartInfo
        {
            FileName = "openfiles.exe",
            Arguments = "/query /FO CSV /v",
            UseShellExecute = false,
            RedirectStandardOutput = true,
            RedirectStandardError = true,
            CreateNoWindow = false
        }
    };
    proc.Start();

    proc.OutputDataReceived += (s,e) => {
        lock (values)
        {
            values.Add(e.Data);
        }
    };
    proc.ErrorDataReceived += (s,e) => {
        lock (values)
        {
            values.Add("! > " + e.Data);
        }
    };

    proc.BeginErrorReadLine();
    proc.BeginOutputReadLine();

    proc.WaitForExit();
    foreach (string sline in values)
        MessageBox.Show(sline);


文章来源: Get Values from Process StandardOutput
标签: c# wpf .net-4.0