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コマンドレットより見やすいと思います。
コマンドを実行して終了コードを判定するぐらいなら比較的簡単ですが、それ以上の情報を拾う場合、標準出力や標準エラーの出力を正規表現などを利用しながら解析することになります。大変ですが、情報が出力されていれば何とかなるはずです。
PowerShell外部コマンドを実行するサンプル2「yt-dlp.exe」
Webで公開されている動画をローカルに保存する「yt-dlp.exe」という外部コマンドがあります。類似のコマンドは色々ありますが、Webサイトの対応状況がとても優秀です。このコマンドをタスクスケジューラーを使い1日1回指定時間に実行し、複...
PowerShell外部コマンドを実行するサンプル3「フォルダ内のファイルを一括処理」
フォルダ内にあるPNGファイルに対しOptiPNGで最適化を施します。※1ls -LiteralPath "C:\Users\karet\Pictures" -Filter "*.png" | % { . "C:\Users\karet\t...
コメント