如何重定向F#标准和错误输出

问题描述 投票:1回答:2

我想重定向F#标准和错误输出

let RunProcess (processInfo : ProcessStartInfo) =
    let str = StringBuilder()
    processInfo.UseShellExecute <- false
    processInfo.RedirectStandardOutput <- true
    processInfo.RedirectStandardError <- true
    let p = new Process()
    p.StartInfo <- processInfo
    p.OutputDataReceived.Add(fun x -> str.Append(x.Data + Environment.NewLine) |> ignore)
    p.ErrorDataReceived.Add(fun x -> str.Append(x.Data + Environment.NewLine) |> ignore)
    p.Start() |> ignore
    p.BeginOutputReadLine()
    p.BeginErrorReadLine()
    str.ToString()

当我这样做,没有发生。

然而,当我设置processInfo.RedirectStandardOutput以虚假的东西都显示在我的控制台。

f#
2个回答
1
投票

Process.Start()不等待启动过程完成执行。另外一个WaitForExit将被要求做,否则机会是很高,你要调用StringBuilder的之前的ToString任何已被写入到它。


1
投票

这是我使用:

let inline tee    f v   = f v ; v
let inline  (|>!) v f   = f v ; v

let RunProcess (startInfo : ProcessStartInfo) =
    let bufferOutput                      = new StringBuilder()
    let bufferError                       = new StringBuilder()
    let dataHandler               handler = DataReceivedEventHandler(fun sender args -> try handler args.Data with _ -> ())
    let consume   (sb: StringBuilder)     = sb.ToString() |>! (fun _ -> sb.Clear() |> ignore)
    let append    (sb: StringBuilder) txt = sb.Append(txt + "\n") |> ignore
    let outputHandler                     = append bufferOutput   |> dataHandler
    let errorHandler                      = append bufferError    |> dataHandler
    startInfo.RedirectStandardInput      <- true
    startInfo.RedirectStandardOutput     <- true
    startInfo.RedirectStandardError      <- true
    startInfo.UseShellExecute            <- false
    let proc                              = new Process(
                                                StartInfo           = startInfo
                                              , EnableRaisingEvents = true     )
    outputHandler                        |> proc.OutputDataReceived.AddHandler
    errorHandler                         |> proc.ErrorDataReceived .AddHandler
    let r                                 = proc.Start                 () 
    do                                      proc.BeginOutputReadLine   ()
    do                                      proc.BeginErrorReadLine    ()
    do                                      proc.WaitForExit           ()
    let output                            = (consume bufferOutput).Trim()
    let error                             = (consume bufferError ).Trim()
    ((if proc.HasExited then proc.ExitCode else -99999), output, error)
© www.soinside.com 2019 - 2024. All rights reserved.