Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

実践編:エラー処理とデバッグ

PowerShell におけるエラーの種類、例外処理構文(try/catch)、エラー動作の制御、および効果的なロギングとデバッグ手法を解説します。

エラーの種類(終了エラーと非終了エラー)

PowerShell のエラーには大きく分けて2つの種類があります。

  • 非終了エラー(Non-terminating Error): コマンドの実行中に一部の処理が失敗しても、残りの処理を中断せずに継続するエラーです(例: 存在しないファイルを1つ開こうとした場合など)。

  • 終了エラー(Terminating Error): スクリプトの実行を即座に停止させる致命的なエラーや例外です。構文エラーや throw で意図的に発生させた例外が該当します。

ErrorAction による動作の制御

非終了エラーが発生した際の動作は、環境変数 $ErrorActionPreference や各コマンドレットの -ErrorAction パラメータで細かく制御できます。

設定値動作
Continueエラーメッセージを表示し、処理を続行(既定値)
Stopエラーメッセージを表示し、終了エラーとして処理を停止
SilentlyContinueエラーメッセージを表示せず、静かに処理を続行
Inquire処理を続行するかユーザーに対話式で確認

» スクリプト全体での安全対策

スクリプトファイルの先頭で $ErrorActionPreference = "Stop" を宣言すると、軽微なエラーであっても即座に停止し、意図しないデータ破損や誤動作を防ぐことができます。

# 未定義変数の参照を禁止
Set-StrictMode -Version Latest

# エラー発生時は即座に停止
$ErrorActionPreference = "Stop"

try / catch / finally による例外処理

終了エラーは try / catch / finally 構文で捕捉して安全にリカバリー処理を実行できます。

非終了エラーを捕捉したい場合は、コマンドレットに -ErrorAction Stop を付与して終了エラーに昇格させます。

try {
    # 存在しないパスを指定し、終了エラーに昇格させる
    Get-ChildItem -Path "Z:\non-existent-path" -ErrorAction Stop
} catch [System.Management.Automation.ItemNotFoundException] {
    Write-Warning "指定されたパスが見つかりませんでした: $($_.Exception.Message)"
} catch {
    # その他のすべての例外を捕捉
    Write-Error "予期しないエラーが発生しました: $_"
} finally {
    # 成功・失敗にかかわらず必ず実行される後処理
    Write-Output "リソースのクリーンアップ処理を完了しました。"
}

catch ブロック内では、発生したエラーオブジェクトが特殊変数 $_(または $PSItem)に格納されます。

出力ストリームとロギング

PowerShell には目的ごとに分離された複数の出力ストリームが用意されています。用途に応じて適切なコマンドレットを使い分けることが重要です。

コマンドレット出力先ストリーム主な役割
Write-Output成功ストリーム(1)パイプラインに渡すメインの出力
Write-Errorエラーストリーム(2)エラー情報の出力
Write-Warning警告ストリーム(3)利用者への注意喚起
Write-Verbose詳細ストリーム(4)処理の進捗や詳細記録(-Verbose 指定時に表示)
Write-Debugデバッグストリーム(5)開発者向けの調査情報(-Debug 指定時に表示)

画面表示専用の Write-Host はパイプラインやリダイレクトで捕捉できないため、自動化スクリプトやツール開発では避け、Write-Output や Write-Verbose を使用します。

デバッグコマンドレットの活用

スクリプトの動作検証を対話的に行うためのデバッグ機能です。

  • Set-PSBreakpoint: 特定のスクリプト行や変数の変更時に処理を一時停止(ブレークポイント)
  • Get-PSBreakpoint: 設定中のブレークポイント一覧を表示
  • Remove-PSBreakpoint: ブレークポイントを解除
# backup.ps1 の15行目にブレークポイントを設定
Set-PSBreakpoint -Script "./backup.ps1" -Line 15