从Process StandardOutput获取值

我试图得到输出显示我的机器上当前打开的文档,但无论如何它返回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三types的exceptionSystem.InvalidOperationException

编辑:

试图拉代码为:

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

在返回时也是一个NULL值,Proc在proc.start();之后仍然有错误。

您必须读取标准输出和标准错误stream。 这是因为你不能从同一个线程读取它们。

为了达到这个目的,你必须使用将在单独的线程上调用的事件处理器 。

将代码编译为anycpu因为openfiles具有32位和64位的变体。 如果架构不匹配,它可能找不到可执行文件。

从错误stream中读取的行将被前置! >所以他们在输出中脱颖而出。

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