実践編:エラー処理とデバッグ
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