スクリプトまたはPowerShellコマンドレットを実行して、以下に示すような赤いテキストの叫び声の壁に直面したことはありますか?
エラーは圧倒的で混乱することがあります。 そして何よりも、エラーは読みにくいことが多く、スクリプトが何をどこで間違っていたのかを判断することは不可能です。,
幸いなことに、PowerShellにはエラー処理によってこれを改善するためのオプションがいくつかあります。 エラー処理を使用すると、エラーをフィルタリングして表示することができ、理解しやすくなります。 また、エラーを理解することで、エラー処理にロジックを簡単に追加できます。
この記事では、PowerShellのエラーと、PowerShellのTry Catch
ブロック(およびfinally
ブロック)を使用してエラー処理を実行するためにそれらを傍受する方法について学びます。,
目次
PowerShellでのエラーの仕組みの理解
エラー処理に入る前に、まずPowerShellでのエラーに関するいくつかの概念について説明しましょう。 エラーを理解することは、より良いエラー処理戦略につな
$Error自動変数
PowerShellには、多くの自動変数があり、そのうちの一つは$Error
自動変数です。 PowerShellは、$Error
変数を使用して、セッションで発生したすべてのエラーを格納します。, $Error
変数は、最新のエラー順に並べ替えられたエラーの配列です。
PowerShellセッションを初めて開くと、$Error
変数は空です。 これを確認するには、$Error
変数を呼び出します。
ご覧のとおり、$Error
変数は空で始まります。, ただし、エラーが生成されると、エラーが追加され、$Error
変数に格納されます。
以下の例では、存在しないサービス名を意図的に取得することによってエラーが生成されます。
PS> Get-Service xyzPS> $ErrorPS> $Error.Count
上記の出力からわかるように、生成されたエラーは$Error
変数。,
$Error変数には、PowerShellセッションで生成されたエラーのコレクションが含まれています。 各エラーアクセスすることが可能ですが呼び出し、その配列の位置にします。 最新のエラーは常にインデックス0になります。
たとえば、最新のエラーは
$Error
を使用して取得できます。
$Errorオブジェクトプロパティ
PowerShellのすべてがオブジェクトであるため、$Error
変数はオブジェクトであり、オブジェ, $Error
変数をGet-Member
コマンドレットにパイプすると、使用可能なプロパティの一覧が表示されます。
$Error | Get-Member
エラーの理由を判断するには、InvocationInfo
以下のコマンドを使用してプロパティ。,
$Error.InvocationInfo
これで、他のプロパティでも同じことを行い、他にどのような情報を見つけることができます!
終了エラー
終了エラー PowerShellと非終了エラーによって実行フローが発生した場合、実行フローを停止します。 終了エラーが発生する方法はいくつかあります。 たとえば、存在しないパラメーターを指定してコマンドレットを呼び出す場合です。,
下のスクリーンショットからわかるように、コマンドGet-Process notepad
実行すると、コマンドは有効であり、メモ帳プロセスの詳細が表示されます。
ただし、存在しないパラメーターがGet-Process notepad -handle 251
のように使用されると、コマンドレットはhandle
パラメータが無効です。 その後、コマンドレットはnotepad
プロセスの詳細を表示せずに終了します。,
終了エラー
終了エラーは、スクリプトまたはコマンドの実行を停止しないエラーです。 たとえば、以下のコードを確認してください。 このコードは、fileslistからファイル名のリストを取得します。txtファイル。 次に、スクリプトは各ファイル名を調べ、各ファイルの内容を読み取り、それを画面に出力します。
$file_list = Get-Content .\filelist.txtforeach ($file in $file_list) { Write-Output "Reading file $file" Get-Content $file}
ファイルリストの内容。,txtファイルは、以下のリストに示されているファイル名です。
File_1.logFile_2.logFile_3.logFile_4.logFile_5.logFile_6.logFile_7.logFile_8.logFile_9.logFile_10.log
しかし、File_6の場合はどうなりますか。ログは実際に存在しませんでしたか? コードを実行すると、スクリプトがFile_6を見つけることができないため、エラーが発生することが予想されます。ログ。 以下に示すような出力が表示されます。
上記の結果のスクリーンショットからわかるように、スクリプトはリスト内の最初の五つのファイルを読み取ることができましたが、ファイルを読み取ろうとしたときに、リスト内の最初の五つのファイルを読み取ることができました。ファイル_6.,txt、エラーが返されます。 その後、スクリプトは終了する前に残りのファイルを読み続けました。 それは終了しませんでした。
$ErrorActionPreference変数
これまでのところ、終了エラーと非終了エラー、およびそれらが互いにどのように異なるかについて学びました。 しかし、非終端エラーは強制的に終了エラーとして扱われることがあることをご存知でしたか?
PowerShellには、優先変数と呼ばれる概念があります。 これらの変数は、PowerShellのさまざまな動作を変更するために使用されます。 これらの変数の一つは、$ErrorActionPreference
と呼ばれます。,
$ErrorActionPreference
変数は、PowerShellが終了しないエラーを処理する方法を変更するために使用されます。 デフォルトでは、$ErrorActionPreference
値はContinue
に設定されます。 $ErrorActionPreference
変数の値をSTOP
に変更すると、PowerShellはすべてのエラーを終了エラーとして処理します。
以下のコードを使用して、$ErrorActionPreference
値を変更します。,
$ErrorActionPreference = "STOP"
その他の有効な$ErrorActionPreference変数値の詳細については、PowerShell ErrorActionPreferenceを参照してください。
ここでは、この記事の”終了しないエラー”セクションで使用されている例を参照してください。 スクリプトは、以下のコードのように$ErrorActionPreference
に変更を含めるように変更できます。
上記の変更されたコードを実行すると、$ErrorActionPreference
値がContinue
のデフォルト値に設定されている場合とは異なる動作になります。,
上記の結果のスクリーンショットからわかるように、スクリプトはリスト内の最初の五つのファイルを読み取るが、ファイルfile_6を読み取ろうとしたとき。txt、ファイルが見つからなかったため、エラーが返されます。 その後、スクリプトは終了し、残りのファイルは読み込まれません。,
$ErrorActionPreference
値は、現在のPowerShellセッションでのみ有効です。 新しいPowerShellセッションが開始されると、既定値にリセットされます。
ErrorAction共通パラメーター
$ErrorActionPreference
値がPowerShellセッションに適用される場合、ErrorAction
パラメーターは、共通パラメーターをサポートする ErrorAction
パラメーターは、$ErrorActionPreference
変数と同じ値を受け入れます。,
ErrorAction
パラメータ値は$ErrorActionPreference
値よりも優先されます。
戻って、前の例で同じコードを使用しましょう。 しかし、今回は、ErrorAction
パラメータがGet-Content
行に追加されます。
変更されたコードを実行した後、$ErrorActionPreference
がContinue
に設定されていても、スクリプトはエラーが発生した後も終了します。, スクリプトは、-ErrorAction
Get-Content
のパラメータ値がSTOP
に設定されているため、終了しました。
PowerShellを使用してTry Catchブロック
この時点で、powershellエラーと、$ErrorActionPreference
変数とErrorAction
パラメーターの仕組みについて学びました。, これで、PowerShellTry Catch Finally
ブロックの良いものについて学ぶ時です。
PowerShelltry catch
ブロック(およびオプションのfinally block
)は、コードの周りにネットをキャストし、返されるエラーをキャッチする方法です。
以下のコードは、Try
ステートメントの構文を示しています。
try { <statement list>}catch *]{ <statement list>}finally { <statement list>}
Try
ブロックには、PowerShellで”試行”してエラーを監視するコードが含まれています。, Try
ブロック内のコードでエラーが発生した場合、エラーは$Error
変数に追加され、Catch
ブロックに渡されます。
Catch
ブロックには、Try
ブロックからエラーを受け取ったときに実行するアクションが含まれています。 Catch
Try
ステートメントには、複数のTry
ブロックが存在する可能性があります。
Finally
ブロックには、Try
ステートメントの最後にあるコードが含まれています。, このブロックは、エラーがカウントされていないかどうかを
非特異エラーをキャッチする(すべてキャッチ)
単純なTry
ステートメントには、Try
とCatch
ブロックが含まれています。 Finally
ブロックはオプションです。
たとえば、非特定の例外をキャッチするには、Catch
パラメータを空にする必要があります。 以下のコード例は、$ErrorActionPreference変数セクションで使用されたが、Try Catch
ブロックを使用するように変更されたのと同じスクリプトを使用しています。,
以下のコードからわかるように、今回はforeach
ステートメントがTry
ブロック内に囲まれています。 次に、Catch
ブロックには、エラーが発生した場合に文字列An Error Occurred
を表示するコードが含まれています。 内のコードFinally
ブロックは、$Error
変数をクリアするだけです。
上記のコードは、PowerShellで実行した後、以下に示すこの出力を提供します。,
上記の出力は、スクリプトがエラーに遭遇し、Catch
ブロック内その後、終了した。
エラー処理のポイントであるエラー処理が処理されました。 ただし、表示されるエラーは一般的すぎました。 よりわかりやすいエラーを表示するには、Exception
Try
ブロックによって渡されたエラーのプロパティにアクセスします。,
以下のコードは、特にCatch
ブロック内のコードを変更して、パイプラインに渡された現在のエラーからの例外メッセージを表示します–$PSItem.Exception.Message
今回は、上記の変更されたコードを実行すると、表示されるメッセージがよりわかりやすくなります。,
特定のエラーをキャッチする
キャッチオールエラー処理が最も適切なアプローチではない場合があります。 場合によっては、発生したエラーの種類に応じたアクションをスクリプトで実行する必要がある場合があります。
エラータイプをどのように判断しますか? 最後のエラーのTypeName
Exception
プロパティの値をチェックします。, たとえば、前の例のエラータイプを見つけるには、次のコマンドを使用します。
$Error.Exception | Get-Member
上記のコードの結果は以下のスクリーンショットのようになります。 ご覧のとおり、TypeName
値が表示されます–System.Management.Automation.ItemNotFoundException
。
インターセプトする必要があるエラータイプがわかったので、コードを変更して具体的にキャッチします。, 以下の変更されたコードからわかるように、二つのCatch
ブロックがあります。 最初のCatch
ブロックは、特定のタイプのエラー(System.Management.Automation.ItemNotFoundException
)を傍受します。 対照的に、第二のCatch
ブロックには、一般的なキャッチオールエラーメッセージが含まれています。
下のスクリーンショットは、上記の変更されたコードの出力を示しています。,
結論
この記事では、PowerShellのエラー、そのプロパティ、およびエラーの特定のタイプ また、$ErrorActionPreference
変数とErrorAction
パラメーターがPowerShellで終了しないエラーをどのように処理するかに影響するかの違いも学びました。,
PowerShellTry Catch Finally
ブロックを使用して、特定のエラーまたはキャッチオールアプローチのエラー処理を実行する方法も学びました。
この記事に示されている例は、Try Catch Finally
ブロックがどのように機能するかの基本のみを示しています。 この記事で得た知識は、スクリプトでのエラー処理の適用を開始するための開始ブロックを提供する必要があります。,
さらに読む
- About_Try_Catch_Finally
- About_Automatic_Variables
- 基本に戻る:PowerShell foreachループ
- 基本に戻る:PowerShellオブジェクトについて