PowerShellではtry-catch-finallyブロックを使って例外を安全に処理できます。バッチファイルのerrorlevelと違い、エラーの種類を判別して適切に対応できるのがPowerShellの強みです。
try-catch-finallyの基本
try {
# エラーが発生する可能性のある処理
$result = 100 / 0
} catch {
# エラー発生時の処理
Write-Host "エラーが発生しました: $_"
} finally {
# 成功・失敗にかかわらず必ず実行
Write-Host "処理終了"
}エラーの種類で処理を分ける
try {
Get-Content "存在しないファイル.txt" -ErrorAction Stop
} catch [System.IO.FileNotFoundException] {
Write-Host "ファイルが見つかりません"
} catch [System.UnauthorizedAccessException] {
Write-Host "アクセス権限がありません"
} catch {
Write-Host "予期しないエラー: $($_.Exception.Message)"
}$Error と -ErrorAction
| -ErrorAction値 | 動作 |
|---|---|
| Continue(デフォルト) | エラーを表示して処理を続ける |
| Stop | エラーを例外として投げてcatchできるようにする |
| SilentlyContinue | エラーを無視して続ける(エラーを表示しない) |
| Inquire | ユーザーに続行するか確認する |
# catchするにはStopが必要
Get-Item "C:\存在しない" -ErrorAction Stop
# エラーを無視(存在確認などで使う)
$proc = Get-Process "存在しないプロセス" -ErrorAction SilentlyContinue
if ($null -eq $proc) { Write-Host "プロセスなし" }
# $ErrorPreference でスクリプト全体のデフォルトを変更
$ErrorActionPreference = "Stop"throw で例外を自分で発生させる
function Test-FileSize {
param([string]$Path, [int]$MaxMB = 100)
$file = Get-Item $Path
$sizeMB = [math]::Round($file.Length / 1MB, 2)
if ($sizeMB -gt $MaxMB) {
throw "ファイルサイズが上限を超えています: ${sizeMB}MB > ${MaxMB}MB"
}
Write-Host "ファイルサイズOK: ${sizeMB}MB"
}
try {
Test-FileSize -Path "C:\bigfile.zip" -MaxMB 50
} catch {
Write-Host "エラー: $_"
}まとめ
- try-catch-finallyで例外を安全に処理できる
- エラーの型([System.IO.FileNotFoundException]等)で処理を分岐できる
- catchするには-ErrorAction Stopが必要
- throwで自前の例外を発生させてエラーを明示的に伝えられる



コメント