ぱたへね

はてなダイアリーはrustの色分けができないのでこっちに来た

F#で外部プロセスを起動する。

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番目が一番好きですね。代入を使ってないことと、さりげなく使っているパイプライン演算子が素敵です。