【问题标题】:How to redirect standard output when spawning a process生成进程时如何重定向标准输出
【发布时间】:2011-08-31 07:02:38
【问题描述】:

我已经为内部服务器构建了一个网络服务,我想向它发送命令并让它启动一个进程。所以我想像这样向它发送一个命令:

http://machine:999/execute?path=c:\scripts\dostuff.exe&args=-test

然后端点会做这样的事情:

public ActionResult(string path, string args)
{

    var proc = new System.Diagnostics.Process();
    proc.StartInfo.FileName = path;
    proc.StartInfo.Arguments = args;
    proc.StartInfo.UseShellExecute = false;
    proc.StartInfo.CreateNoWindow = true;
    proc.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    proc.StartInfo.RedirectStandardOutput = true;

    //Hook into all standard output here

    //Block until process is returned - Async Controller action

    return Content(output.ToString())
}

我希望能够捕获可执行文件生成的所有错误消息和标准输出。可执行文件可以是控制台应用程序或 powershell 脚本之类的任何东西。做这种事情的最佳方法是什么?

【问题讨论】:

    标签: c# asp.net-mvc-3 .net-4.0 redirectstandardoutput


    【解决方案1】:

    使用 proc.StandardOutput.ReadToEnd() 将重定向的输出流读取到末尾,然后返回。

    您可能还想将 RedirectStandardError 设置为 True 并使用 proc.StandardError 执行相同的操作以获取错误消息。您可以生成一个后台线程以在主线程中读取标准输出的同时同步读取标准错误。

    【讨论】:

    • 忘了提,但这个问题可能对你也有用:stackoverflow.com/questions/1369236/…
    • 此解决方案适用于 cmd 和其他可执行文件,但适用于 powershell 脚本。关于如何使其也适用于 powershell 的任何想法?
    • 我认为您需要直接查找并执行 PowerShell 可执行文件,将您的脚本作为参数传递。您可以测试 PowerShell 扩展的路径参数并提供特殊处理。将 UseShellExecute 设置为 true 将允许执行 PS 脚本,但不允许输出重定向(您可能已经发现)。这似乎是 Windows API 的限制,因此您无能为力。重定向需要使用 CreateProcess API,它需要一个可执行文件...
    • 我想通了。我在显示之前错误地覆盖了输出数据 =) Doh!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 2011-01-10
    • 1970-01-01
    • 2022-12-14
    • 1970-01-01
    • 2023-04-05
    • 2011-05-16
    相关资源
    最近更新 更多