【问题标题】:Alternatives to reading Process output读取过程输出的替代方法
【发布时间】:2016-01-22 03:10:28
【问题描述】:

我想知道是否有其他替代方法可以在 C# 中捕获进程输出。 我有以下代码

Process __process = new Process();
__process.StartInfo.Verb = "runas";
__process.StartInfo.FileName = "some file path here";
__process.StartInfo.UseShellExecute = true;
__process.Start();
__process.WaitForExit(300000);

此处 UseShellExecute 设置为 true 的原因是动词“runas”需要以管理员身份运行。结果,我无法再重定向程序的标准输出。 如果我不能使用 StandardOutput,还有哪些其他方法可以捕获 Process 的输出?我想过让程序写入一个文件,然后从该文件中读取,但这似乎效率不高。

【问题讨论】:

  • 虽然我确实倾向于在我的代码中争取效率...这个过程需要经常运行吗?输出是否会非常大并且需要相当长的时间才能读入?如果没有,那么如果可以的话,我会坚持使用 File I/O

标签: c# process io


【解决方案1】:

如果您可以编写实际程序,那么您将开始使用管道,这可能是最好/最有效的解决方案。可能有一种方法可以让其他命令/程序通过管道传输进程输出。

Pipe Operations in the .Net Framework

您可以创建一个命名或anonymous pipe 并将其名称/id/句柄作为参数传递给程序。然后程序可以连接到管道的另一端并将数据流回调用它的应用程序。

编辑我假设这一切都在 Windows 环境中运行,我不知道在以 UseShellExecute = true 开头的进程上使用管道是否有效..

【讨论】:

  • 我不建议将管道作为跨不同帐户进行通信的首选(请注意,OP 需要“runas”),因为需要正确处理安全性以使其正常工作(尤其是在没有合理样本的情况下)。如果可能的话,按照 OP 的建议将数据保存到文件会更容易/更安全。
  • @AlexeiLevenkov 同意,​​保存到文件肯定会更容易。我只建议这样做,因为 OP 已经考虑使用文件并且无法捕获标准输出。我有点急于提供替代方案
猜你喜欢
  • 2015-04-23
  • 1970-01-01
  • 2014-03-25
  • 2016-04-02
  • 1970-01-01
  • 2022-01-01
  • 2018-03-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多