F#で外部コマンドを起動し, その標準出力結果を扱う
コード
open System.IO open System.Diagnostics let cmd = new Process() cmd.StartInfo.FileName <- "ls" cmd.StartInfo.Arguments <- "-l /usr/bin" cmd.StartInfo.UseShellExecute <- false cmd.StartInfo.RedirectStandardOutput <- true if cmd.Start() |> not then failwith "Failed to execute command" using (new StreamWriter("tmp.txt")) (fun writer -> cmd.OutputDataReceived.Add(fun e -> writer.WriteLine(e.Data)) cmd.BeginOutputReadLine() cmd.WaitForExit())
C#と同じではあるのだけど。ハマりどころとしては event(OutputDataReceived
)を使わないと出力が大きい場合 4096 byteしか読めないという問題があった.
ただ行単位かつ改行コードは stripされた状態でイベントハンドラーに渡ってくるので微妙な感じは少しある. 今は dotnetはクロスプラットフォームだけど
プロセスの扱いとかは Win32 APIにめちゃ引っ張られているなぁという感じがする.