PowerShell外部コマンドを実行するサンプル

コンピュータ
PowerShellのあれこれ

PowerShellスクリプトで外部コマンドを実行する方法としては「.」でコマンドを実行する方法と「Start-Processコマンドレット」を使う方法があります。
細かな制御が出来るのはStart-Processコマンドレットなのですが、これはSystem.Diagnostics.Process.Start()メソッドを実行しているとのことです。
今回はSystem.Diagnostics.Processのオブジェクトを直接生成して、終了コード、標準出力、標準エラーを取得するサンプルを作ってみました。
ちなみに実行すコマンドはffmpeg.exeのヘルプを表示させています。

<#
.SYNOPSIS
 外部コマンドを実行するサンプル
.DISCRIPTION
 System.Diagnostics.Processを使用
#>

using namespace System.Diagnostics

$ffmpegExe = "H:\tools\ffmpeg.exe"
$argument = "--help"

try {
    $p = [Process]::new()

    $p.StartInfo.FileName = $ffmpegExe
    $p.StartInfo.Arguments = $argument
    $p.StartInfo.UseShellExecute = $False
    $p.StartInfo.RedirectStandardOutput = $True
    $p.StartInfo.RedirectStandardError = $True

    $p.Start() | Out-Null

    $stdout = $p.StandardOutput.ReadToEnd()
    $stderr = $p.StandardError.ReadToEnd()


    # 終了を待つ
    $p.WaitForExit()

    # 終了コード
    Write-Host ("終了コードは「{0}」でした。" -f $p.ExitCode)
    
    # 標準出力
    Write-Host "*** 標準出力 ****"
    Write-Host $stdout

    # 標準エラー
    Write-Host "*** 標準エラー ****"
    Write-Host $stderr

} finally {
    $p.Dispose()
} 

Start-Processコマンドレットと比べてコードの行数が多くなりますが、多量の引数を取るStart-Processコマンドレットより見やすいと思います。

コマンドを実行して終了コードを判定するぐらいなら比較的簡単ですが、それ以上の情報を拾う場合、標準出力や標準エラーの出力を正規表現などを利用しながら解析することになります。大変ですが、情報が出力されていれば何とかなるはずです。

コメント