F#で外部プロセスを起動する方法を調べました。
3種類ありますが、少し書き方が違うだけでどれも同じ方法です。注意することは、外部プロセスが終了するまで待つときは、WaitForExit()が必要。これに気がつかなくて、少しはまりました。
その1
twitterでつぶやいたら、@igetaさんに教えてもらいました。ありがとうございます。
https://gist.github.com/1284336から。Process.Startメソッドの引数に、外部プロセスの情報を渡しています。
open System open System.Diagnostics let cmd s = let p = Process.Start(ProcessStartInfo(FileName=Environment.GetEnvironmentVariable("ComSpec"), Arguments="/c "+s, CreateNoWindow=true, UseShellExecute=false, RedirectStandardOutput=true)) Console.WriteLine(p.StandardOutput.ReadToEnd()) p.WaitForExit() cmd "dir"
その2
僕がMSDNと格闘しながら見つけた方法です。先にProcessを作り、プロパティに外部プロセスの情報を設定しています。
use ps = new Process() let startInfo = ProcessStartInfo() ps.StartInfo.Arguments <- arg //引数 ps.StartInfo.FileName <- exefile //実行ファイル名 ps.StartInfo.WorkingDirectory <- workdir ps.StartInfo.UseShellExecute <- false ps.Start() |> ignore ps.WaitForExit()
その3
プログラミング言語の比較から。
http://programming-languages.appspot.com/comparison/category/misc#8e6bb274
先にProcessStartInfoを作り、パイプライン演算子を使ってProcess.Startに外部プロセスの情報を渡しています。
let p = new ProcessStartInfo("java", "-help", RedirectStandardOutput = true, StandardOutputEncoding = Encoding.ASCII, UseShellExecute = false ) |> Process.Start let output = p.StandardOutput.ReadToEnd p.WaitForExit() let exitCode = p.ExitCode
個人的にはこの3番目が一番好きですね。代入を使ってないことと、さりげなく使っているパイプライン演算子が素敵です。