C#と諸々

C#がメインで他もまぁ諸々なブログです
おかしなこと書いてたら指摘してくれると嬉しいです(´・∀・`)
つーかコメント欲しい(´・ω・`)

2008/04/03 00:55
ビルド自動化のために。
PowerShell でプロセスを実行する関数。


[ パラメータ ]
processPath
プロセス (実行可能ファイル) のパス。

processArgs
プロセスを実行する際に渡す引数。
省略可能。

timeoutMilliseconds
プロセスの実行時間に対するタイムアウト値 (単位:ミリ秒)。
無制限に待機する場合、-1 または Int32.MaxValue を指定。
省略した場合は -1。


[ 戻り値 ]
プロセスの実行結果に関する情報を格納するハッシュテーブル。
各キーの説明を以下に記述する。

IsSuccess
プロセスが正常終了した場合は true、それ以外の場合は false。
プロセスが正常終了したかどうかは、プロセスの終了コードを元に判断される。

IsComplete
プロセスがタイムアウトせずに完了した場合は true、それ以外の場合は false。

Message
プロセスが実行中に出力したメッセージ。

ErrorMessage
プロセスが実行中に出力したエラーメッセージ。


[ Invoke-Process 関数 ]
function global:Invoke-Process
{
    param ([string] $processPath, [string]$processArgs, [int]$timeoutMilliseconds = [System.Threading.Timeout]::Infinite)
    trap
    {
        if ($() -ne $process)
        {
            $process.Dispose();
        }
        break;
    }
   
    if ([String]::IsNullOrEmpty($processPath)) { throw "引数 processPath が null または空の文字列です。"; }
   
    $process = New-Object "System.Diagnostics.Process";
    $process.StartInfo = New-Object "System.Diagnostics.ProcessStartInfo" @($processPath, $processArgs);
    $process.StartInfo.WorkingDirectory = (Get-Location).Path;
    $process.StartInfo.RedirectStandardOutput = $True;
    $process.StartInfo.RedirectStandardError = $True;
    $process.StartInfo.UseShellExecute = $False;
    $process.Start() | Out-Null;
   
    $message = $process.StandardOutput.ReadToEnd();
    $errorMessage = $process.StandardError.ReadToEnd();
    $complete = $process.WaitForExit($timeoutMilliseconds);
    if (!$complete)
    {
        $process.Kill();
    }
   
    $result =
        @{
            "IsSuccess" = ($process.ExitCode -eq 0);
            "IsComplete" = $complete;
            "Message" = $message;
            "ErrorMessage" = $errorMessage;
        };
    $process.Dispose();
   
    return $result;
}



[ 使用例 ]
$result = Invoke-Process "$Env:ProgramFiles\Microsoft Visual Studio 9.0\Common7\IDE\devenv.com" "/rebuild Release `"C:\work\Hoge\Hoge.sln`"";
Write-Host $result.Message;
if (!$result.IsSuccess)
{
    Write-Host "ソリューションのリビルドに失敗しました。" -ForegroundColor "Red";
}





【 ダウンロード 】
自作の PowerShell 関数は、以下の記事からまとめてダウンロードできます。

YokoKen.PowerShell.Scripts

# 変更履歴
2008/08/24
 ・標準出力ストリームでデッドロックが発生するバグを修正。











トラックバックURL↓
http://csharper.blog57.fc2.com/tb.php/206-1d0d3695