PowerShellでコマンドを実行していると、「コマンドが失敗したけど、具体的な原因が分からない」ということがあります。
PowerShellでは、実行時に発生したエラー情報を $Error 変数に保存しています。
$Error を確認すると、エラーメッセージだけでなく、例外の種類やエラーが発生した場所など、トラブルの原因を調査するために必要な情報を確認できます。
例えば、Powershellスクリプトとタスクスケジューラを組み合わせて毎日自動実行するときなど手動で実行する場合などにもエラーログを残しておくことで原因特定につなげやすくなります。
また、スクリプトでエラーを適切に処理したい場合は、try-catch を利用できます。
この記事では、PowerShellで発生したエラーを $Error や try-catch を使って確認・取得する方法を紹介していきます。
1.PowerShellで発生したエラーを確認する
PowerShellでは、コマンドの実行時にエラーが発生すると、そのエラー情報が自動的に$Error変数へ保存されます。
例えば、存在しないコマンドを実行してみます。
Get-TestCommand存在しないコマンドなので、以下のようなエラーが発生します。
PS C:\> Get-TestCommand
Get-TestCommand : 用語 'Get-TestCommand' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名
前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認して
から、再試行してください。
発生場所 行:1 文字:1
+ Get-TestCommand
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Get-TestCommand:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundExceptionこのとき、$Errorを実行すると、直前に発生したエラーを含むエラー履歴を確認できます。
PS C:\> $Error
Get-TestCommand : 用語 'Get-TestCommand' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名
前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認して
から、再試行してください。
発生場所 行:1 文字:1
+ Get-TestCommand
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Get-TestCommand:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException1-1. 過去に発生したエラーも保存されている
$Errorには、直近のエラーだけではなく、過去に発生したエラーも保存されています。
そのため、エラーの原因を調査するときは、まず$Errorを確認すると便利です。
上記のエラーに続けて、以下のように意図的に別のエラーを発生させます。
# 意図的にエラーを発生
1/0もちろん以下のようにエラーとなります。
PS C:\> # 意図的にエラーを発生
PS C:\> 1/0
0 で除算しようとしました。
発生場所 行:1 文字:1
+ 1/0
+ ~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeExceptionこの時、再度 $Error を実行してみます。
すると、Get-TestCommand の実行時のエラーと0で除算しようとしたエラーの2つのエラーが表示されます。
PS C:\> $Error
0 で除算しようとしました。
発生場所 行:1 文字:1
+ 1/0
+ ~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException
Get-TestCommand : 用語 'Get-TestCommand' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名
前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認して
から、再試行してください。
発生場所 行:1 文字:1
+ Get-TestCommand
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (Get-TestCommand:String) [], CommandNotFoundException
+ FullyQualifiedErrorId : CommandNotFoundException1-2. 直前のエラーを出力する
上述の通り、$Error には複数のエラー情報が保存されるため、直前に発生したエラーだけを確認したい場合は $Error[0] を使用します。
実行してみると、 0で除算しようとしてエラーになったログだけ確認できます。
PS C:\> $Error[0]
0 で除算しようとしました。
発生場所 行:1 文字:1
+ 1/0
+ ~~~
+ CategoryInfo : NotSpecified: (:) [], RuntimeException
+ FullyQualifiedErrorId : RuntimeException$Errorは配列のように扱うことができ、[0]には最も新しく発生したエラーが格納されています。
「直前のPowerShellエラーを確認したい」という場合に最も手軽な方法です。
2.PowerShellのエラー内容を詳しく確認する
$Error[0] だけでも十分にエラーの原因などを特定することは可能ですが、それぞれのプロパティに絞って情報を確認することもできます。
2-1. Exceptionを確認する
PowerShellのエラー情報には、Exceptionプロパティがあります。
PS C:\> $Error[0].Exception
0 で除算しようとしました。Exceptionを確認すると、エラーの原因となった例外情報を確認できます。
さらに、例外のメッセージだけを取得したい場合は、以下のようにします。
$Error[0].Exception.Messageこうすると、$Error[0]から必要な情報だけを取り出すことができ、スクリプトの中でエラー内容をログへ出力したい場合などに利用することができます。
2-2. FullyQualifiedErrorId を確認する
PowerShellでエラーが発生した場合、エラーメッセージだけでは原因を特定しにくいことがあります。
そのような場合は、FullyQualifiedErrorIdを確認すると、発生したエラーの種類を調べる手掛かりになります。
以下のコマンドを実行することで、FullyQualifiedErrorId を確認できます。
PS C:\> $Error[0].FullyQualifiedErrorId
RuntimeException2-3. InvocationInfo を確認する
「どの行でエラーが発生したのか」を確認する場合には、InvocationInfoプロパティから確認できます。
tryを利用してエラーが発生するスクリプトを作成して試してみます。
PS C:\> try {
>> Invoke-NonExistingCommand -Param "test"
>> }
>> catch {
>> Write-Host "▼ 例外を捕捉しました"
>> Write-Host "エラータイプ: $($_.Exception.GetType().Name)"
>> Write-Host "メッセージ: $($_.Exception.Message)"
>> }
▼ 例外を捕捉しました
エラータイプ: CommandNotFoundException
メッセージ: 用語 'Invoke-NonExistingCommand' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。名前が正しく記述されていることを確認し、パスが含まれている場合はそのパスが正しいことを確認してから、再試行してください。
PS C:\>
PS C:\> $Error[0].InvocationInfo.PositionMessage
発生場所 行:2 文字:5
+ Invoke-NonExistingCommand -Param "test"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~この場合、スクリプト内の3行目でエラーが出ていることがわかります。
2.PowerShellのエラーをtry-catchで処理する
PowerShellスクリプトを作成する場合は、エラーが発生したときに処理を中断したり、別の処理を実行したりしたいケースがあります。
このような場合は、try-catch を使用します。
try-catch を利用すると、エラーが発生する可能性がある処理と、エラーが発生した場合の処理を分けて記述できます。
2-1. try-catchの基本
try-catch の基本的な構文は以下です。
try {
# エラーが発生する可能性がある処理
}
catch {
# エラーが発生した場合の処理
}例えば、存在しないファイルを読み込んでみます。
$ErrorActionPreference = “Stop”
try {
Get-Content "C:\Test\sample.txt"
}
catch {
Write-Host "エラーが発生しました"
}Get-Contentでエラーが発生すると、catchの中に記述した処理が実行されます。
$ErrorActionPreference については次の項目で記載していますのでそちらを確認してください。
このように、PowerShellではtryに通常の処理、catchにエラー発生時の処理を記述します。
また、必要に応じて finally を追加することもできます。
try {
# 処理
}
catch {
# エラー発生時の処理
}
finally {
# 最後に必ず実行する処理
}finally は、エラーが発生した場合でも、発生しなかった場合でも実行される処理を記述するときに使用します。
2-1-1. $ErrorActionPreferenceによるエラー処理の制御
PowerShell には、エラー処理の動作を制御するために $ErrorActionPreference という変数があります。
この変数によって、エラーが発生したときに PowerShell がどのように動作するかが決まります。
Continue:デフォルトの動作。エラーが発生しても続行。Stop:エラーが発生すると、例外がスローされ、Catchブロック内で処理される。SilentlyContinue:エラーメッセージを表示せずに続行。Inquire:エラーが発生したときにユーザーにどうするかを質問する。
PowerShell では Continue がデフォルトの設定となっています。
# デフォルトで実行した場合
PS C:\> try {
>> Get-Content "C:\Test\sample.txt"
>> }
>> catch {
>> Write-Host "エラーが発生しました"
>> }
Get-Content : パス 'C:\Test\sample.txt' が存在しないため検出できません。
発生場所 行:2 文字:5
+ Get-Content "C:\Test\sample.txt"
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : ObjectNotFound: (C:\Test\sample.txt:String) [Get-Content], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetContentCommand
# $ErrorActionPreference を Stop として設定した場合
PS C:\> $ErrorActionPreference = “Stop”
PS C:\> try {
>> Get-Content "C:\Test\sample.txt"
>> }
>> catch {
>> Write-Host "エラーが発生しました"
>> }
エラーが発生しました2-2. catchでエラー内容を取得する
catchの中では、発生したエラーの情報を取得できます。
例えば、エラーメッセージを表示する場合は以下のようにします。
try {
Get-Content "C:\Test\sample.txt"
}
catch {
Write-Host $_
}$_ には、catchで捕捉したエラー情報が格納されています。
エラーメッセージだけを取得したい場合は、Exception.Messageを使用します。
try {
Get-Content "C:\Test\sample.txt"
}
catch {
Write-Host $_.Exception.Message
}この方法を使うと、エラーが発生したときに画面へ分かりやすいメッセージを表示できます。
例えば、PowerShellスクリプトを自動実行している場合は、エラー内容をログファイルに保存する処理と組み合わせることもできます。
3.PowerShellのエラーをログファイルに保存する
PowerShellスクリプトを手動で実行している場合は、エラーが発生したことを画面上で確認できます。
しかし、タスクスケジューラなどを利用してPowerShellスクリプトを自動実行している場合、画面を確認できないため、エラー内容をログファイルに保存しておくと便利です。
PowerShellでは、Out-File などを利用してエラー情報をファイルに保存できます。
3-1. エラー内容をテキストファイルに保存する
例えば、catchで取得したエラーメッセージをテキストファイルに保存する場合は、以下のように記述します。
try {
Get-Content "C:\Test\sample.txt"
}
catch {
$_.Exception.Message | Out-File "C:\Logs\error.log"
}このスクリプトでエラーが発生すると、C:\Logs\error.log にエラーメッセージが保存されます。
既にログファイルが存在していて、そこへ追記したい場合は -Append を使用します。
try {
Get-Content "C:\Test\sample.txt"
}
catch {
$_.Exception.Message | Out-File "C:\Logs\error.log" -Append
}-Appendを指定すると、既存のログを削除せずに新しいエラー情報を追記できます。
PowerShellスクリプトを定期的に実行する場合は、ログを追記する方法が便利です。
3-2. 日時を付けてログを保存する
エラーログを保存する場合、エラーが発生した日時も一緒に記録しておくと、後から原因を調査しやすくなります。
Get-Date を使用して日時を取得し、エラーメッセージと一緒に保存できます。
try {
Get-Content "C:\Test\sample.txt"
}
catch {
$date = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
$message = "$date ERROR: $($_.Exception.Message)"
$message | Out-File "C:\Logs\error.log" -Append
}例えば、以下のようなログが保存されます。
2026-09-02 16:50:18 ERROR: パス 'C:\Test\sample.txt' が存在しないため検出できません。
2026-09-02 16:52:32 ERROR: 0 で除算しようとしました。日時を付けておくことで、いつエラーが発生したのかを後から確認できます。
特に、タスクスケジューラなどでPowerShellスクリプトを定期的に実行している場合は、エラー発生日時を記録しておくとトラブルシューティングに役立ちます。
