PowerShellでエラー処理を書く場面は、最初のうちは「とりあえず実行して、失敗したらメッセージを見る」というやり方になりがちです。私も最初はその状態で、コピー処理やファイル削除処理をそのまま並べて書き、途中で失敗した時にどこで止まったのか分かりにくくて何度も確認し直していました。
特にPowerShellは、赤字のエラーが出てもスクリプト自体は続行することがあり、見た目だけでは「本当に失敗として扱えているのか」が分かりにくいです。そこで重要になるのが try/catch です。try に通常処理を書き、失敗時の処理を catch にまとめることで、エラー発生時の流れを整理しやすくなります。さらに finally まで理解しておくと、ログ出力や後片付けまで安定して書けます。
この記事では、PowerShellのエラー処理の基本として try/catch の使い方、よくあるつまずき、実務で使いやすい書き方についてまとめてます。
PowerShellのエラー処理で最初に知っておきたいこと

PowerShellのエラー処理を理解するうえで、最初に押さえたいのは「すべてのエラーが catch に入るわけではない」という点です。
PowerShellには大きく分けて、処理を停止させるエラーと、警告のように表示されても処理が続くエラーがあります。try/catch で捕まえやすいのは、基本的に処理を停止させるエラーです。
そのため、コマンドによってはエラーが表示されているのに catch が動かないことがあります。これは失敗ではなく、PowerShellの仕様によるものです。
try/catch の基本構造
PowerShellの基本形は次の考え方です。
- try
- catch
- finally
WordPressに貼りやすいよう、構文は本文内でそのまま見せます。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
try { Copy-Item -Path "C:\data\sample.txt" -Destination "D:\backup\sample.txt" -ErrorAction Stop } catch { Write-Host "コピーに失敗しました" } finally { Write-Host "処理を終了します" } |
この形をベースにすると、通常処理と異常時処理を分けて整理できます。
PowerShellを使っていると、スクリプトや出力ログの日本語が文字化けすることがあります。特にUTF-8やShift-JISの違いによって文字が崩れるケースはよくあるトラブルです。文字コードが原因で正常に表示されない場合は、PowerShellの文字化けを修正する方法をまとめた次の記事も参考にしてください。

try/catch が必要になる理由
PowerShellで try/catch を使う最大の理由は、失敗時の動きを自分で制御しやすくなることです。
たとえば、ファイルが存在しない、アクセス権がない、ネットワーク先に接続できないといった場合、何も対策しないと赤字エラーだけが表示されて終わることがあります。これでは利用者にも分かりにくく、運用時の確認も面倒です。
try/catch を使えば、エラー時に次のような処理をまとめて書けます。
| 目的 | 例 |
|---|---|
| エラー内容を表示する | 失敗理由を画面に出す |
| ログを残す | テキストファイルへ記録する |
| 後続処理を止める | 想定外の処理継続を防ぐ |
| 別処理へ切り替える | 予備フォルダへ保存する |
エラーを「出るかどうか」ではなく、「出た後にどう扱うか」で考えるのがポイントです。
catch が動かない原因は ErrorAction にあることが多い
PowerShellの try/catch で最も多い初歩的なつまずきが、catch が実行されないことです。
これはコマンドが非停止エラーとして扱われている場合によく起こります。見た目にはエラーが出ていても、PowerShell側では「致命的ではない」と判断され、catch に渡されません。
そのため、catch で確実に拾いたい処理には -ErrorAction Stop を付けるのが基本です。
例:catch が動きやすい書き方
|
1 2 3 4 5 6 7 8 9 10 |
try { Remove-Item -Path "C:\temp\sample.txt" -ErrorAction Stop Write-Host "削除に成功しました" } catch { Write-Host "削除に失敗しました" Write-Host $_.Exception.Message } |
ここで使っている $_ は、catch の中で発生したエラー情報を参照するための変数です。実務では $_.Exception.Message を表示するだけでも、原因特定がかなり楽になります。
try/catch の基本的な書き方
実務で使いやすいのは、成功時と失敗時のメッセージをはっきり分ける書き方です。特にバッチ的な用途では、あとから見返した時に流れが分かることが大切です。
ファイルコピーの例
|
1 2 3 4 5 6 7 8 9 10 |
try { Copy-Item -Path "C:\work\input.csv" -Destination "D:\backup\input.csv" -ErrorAction Stop Write-Host "ファイルのコピーが完了しました" } catch { Write-Host "ファイルのコピーに失敗しました" Write-Host $_.Exception.Message } |
この形なら、正常終了と異常終了を判別しやすくなります。
finally を使う例
finally は、成否に関係なく必ず最後に実行したい処理に使います。
|
1 2 3 4 5 6 7 8 9 10 11 12 |
try { Get-Content "C:\work\data.txt" -ErrorAction Stop } catch { Write-Host "ファイルの読み込みに失敗しました" } finally { Write-Host "後処理を実行しました" } |
ログファイルのクローズや終了メッセージの出力などに向いています。
具体的にどんな場面で使うべきか
try/catch は、失敗する可能性がある処理に使うのが基本です。逆に、単純な変数代入など失敗しにくい処理まで全部囲むと、かえって読みにくくなります。
特に使いやすい場面は次のとおりです。
| 場面 | 例 |
|---|---|
| ファイル操作 | Copy-Item、Move-Item、Remove-Item |
| フォルダ作成 | New-Item |
| 読み書き処理 | Get-Content、Set-Content |
| 外部接続 | Invoke-WebRequest、REST API呼び出し |
| 権限依存の処理 | 管理者権限が必要な操作 |
「失敗した時に、そのままでは困る処理」に絞って try/catch を使うと、スクリプト全体が見やすくなります。
PowerShellのエラー処理で意識したいポイント
エラーメッセージを隠しすぎない
catch の中で「失敗しました」だけを書くと、原因調査がしにくくなります。最低でも $_.Exception.Message は確認できるようにしておくのがおすすめです。
try を広げすぎない
大量の処理を一つの try にまとめると、どこで失敗したのか分かりにくくなります。コピー処理、削除処理、接続処理など、意味のかたまりごとに分けた方が管理しやすいです。
事前チェックと組み合わせる
存在確認ができるものは、最初に Test-Path を使って確認する方法も有効です。try/catch だけに頼るより、事前確認と併用した方が丁寧です。
よくある質問(Q & A)
- PowerShellでエラーが出ているのに catch が動かないのはなぜですか?
-
非停止エラーとして扱われている可能性があります。catch で処理したいコマンドには、-ErrorAction Stop を付けて明示的に停止エラーへ変えるのが基本です。
- catch の中の $_ は何を表していますか?
-
発生したエラー情報を表します。よく使うのは $_.Exception.Message で、具体的な失敗理由を確認できます。
- finally は必ず書く必要がありますか?
-
必須ではありません。成功・失敗に関係なく最後に実行したい処理がある場合だけ使えば十分です。後処理が不要なら、try/catch だけでも問題ありません。
- try/catch はすべての処理に付けるべきですか?
-
そこまで広げる必要はありません。失敗する可能性があり、失敗時に明確な対応が必要な処理に絞って使う方が、スクリプトは読みやすくなります。
まとめ
PowerShellのエラー処理では、try/catch を使って通常処理と異常時処理を分けるのが基本です。ただし、PowerShellではエラーが表示されても catch に入らないことがあるため、-ErrorAction Stop の考え方をセットで押さえることが重要です。
まずは、ファイルコピーや削除処理のような失敗しやすい部分から try/catch を取り入れるのがおすすめです。さらに $_.Exception.Message で原因を確認できるようにしておけば、トラブル時の切り分けもかなり楽になります。PowerShellのスクリプトを安定して運用したいなら、try/catch は早めに慣れておきたい基本構文です。



