Adam the Automator (日本語)

スクリプトまたはPowerShellコマンドレットを実行して、以下に示すような赤いテキストの叫び声の壁に直面したことはありますか?

PowerShellのエラーの例

エラーは圧倒的で混乱することがあります。 そして何よりも、エラーは読みにくいことが多く、スクリプトが何をどこで間違っていたのかを判断することは不可能です。,

幸いなことに、PowerShellにはエラー処理によってこれを改善するためのオプションがいくつかあります。 エラー処理を使用すると、エラーをフィルタリングして表示することができ、理解しやすくなります。 また、エラーを理解することで、エラー処理にロジックを簡単に追加できます。

この記事では、PowerShellのエラーと、PowerShellのTry Catchブロック(およびfinallyブロック)を使用してエラー処理を実行するためにそれらを傍受する方法について学びます。,

目次

PowerShellでのエラーの仕組みの理解

エラー処理に入る前に、まずPowerShellでのエラーに関するいくつかの概念について説明しましょう。 エラーを理解することは、より良いエラー処理戦略につな

$Error自動変数

PowerShellには、多くの自動変数があり、そのうちの一つは$Error自動変数です。 PowerShellは、$Error変数を使用して、セッションで発生したすべてのエラーを格納します。, $Error変数は、最新のエラー順に並べ替えられたエラーの配列です。

PowerShellセッションを初めて開くと、$Error変数は空です。 これを確認するには、$Error変数を呼び出します。

$Error変数は空です

ご覧のとおり、$Error変数は空で始まります。, ただし、エラーが生成されると、エラーが追加され、$Error変数に格納されます。

以下の例では、存在しないサービス名を意図的に取得することによってエラーが生成されます。

PS> Get-Service xyzPS> $ErrorPS> $Error.Count
エラーは$Error変数に追加されます

上記の出力からわかるように、生成されたエラーは$Error変数。,

$Error変数には、PowerShellセッションで生成されたエラーのコレクションが含まれています。 各エラーアクセスすることが可能ですが呼び出し、その配列の位置にします。 最新のエラーは常にインデックス0になります。

たとえば、最新のエラーは$Errorを使用して取得できます。

$Errorオブジェクトプロパティ

PowerShellのすべてがオブジェクトであるため、$Error変数はオブジェクトであり、オブジェ, $Error変数をGet-Memberコマンドレットにパイプすると、使用可能なプロパティの一覧が表示されます。

$Error | Get-Member
$Errorオブジェクトのプロパティ

エラーの理由を判断するには、InvocationInfo以下のコマンドを使用してプロパティ。,

$Error.InvocationInfo
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のデフォルト値に設定されている場合とは異なる動作になります。,

$ErrorActionPreference変数

上記の結果のスクリーンショットからわかるように、スクリプトはリスト内の最初の五つのファイルを読み取るが、ファイルfile_6を読み取ろうとしたとき。txt、ファイルが見つからなかったため、エラーが返されます。 その後、スクリプトは終了し、残りのファイルは読み込まれません。,

$ErrorActionPreference値は、現在のPowerShellセッションでのみ有効です。 新しいPowerShellセッションが開始されると、既定値にリセットされます。

ErrorAction共通パラメーター

$ErrorActionPreference値がPowerShellセッションに適用される場合、ErrorActionパラメーターは、共通パラメーターをサポートする ErrorActionパラメーターは、$ErrorActionPreference変数と同じ値を受け入れます。,

ErrorActionパラメータ値は$ErrorActionPreference値よりも優先されます。

戻って、前の例で同じコードを使用しましょう。 しかし、今回は、ErrorActionパラメータがGet-Content行に追加されます。

変更されたコードを実行した後、$ErrorActionPreferenceContinueに設定されていても、スクリプトはエラーが発生した後も終了します。, スクリプトは、-ErrorActionGet-Contentのパラメータ値がSTOPに設定されているため、終了しました。

ErrorActionパラメータ

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ブロックからエラーを受け取ったときに実行するアクションが含まれています。 CatchTryステートメントには、複数のTryブロックが存在する可能性があります。

Finallyブロックには、Tryステートメントの最後にあるコードが含まれています。, このブロックは、エラーがカウントされていないかどうかを

非特異エラーをキャッチする(すべてキャッチ)

単純なTryステートメントには、TryCatchブロックが含まれています。 Finallyブロックはオプションです。

たとえば、非特定の例外をキャッチするには、Catchパラメータを空にする必要があります。 以下のコード例は、$ErrorActionPreference変数セクションで使用されたが、Try Catchブロックを使用するように変更されたのと同じスクリプトを使用しています。,

以下のコードからわかるように、今回はforeachステートメントがTryブロック内に囲まれています。 次に、Catchブロックには、エラーが発生した場合に文字列An Error Occurredを表示するコードが含まれています。 内のコードFinallyブロックは、$Error変数をクリアするだけです。

上記のコードは、PowerShellで実行した後、以下に示すこの出力を提供します。,

エラーが発生したときにスクリプトが終了しました

上記の出力は、スクリプトがエラーに遭遇し、Catchブロック内その後、終了した。

エラー処理のポイントであるエラー処理が処理されました。 ただし、表示されるエラーは一般的すぎました。 よりわかりやすいエラーを表示するには、ExceptionTryブロックによって渡されたエラーのプロパティにアクセスします。,

以下のコードは、特にCatchブロック内のコードを変更して、パイプラインに渡された現在のエラーからの例外メッセージを表示します–$PSItem.Exception.Message

今回は、上記の変更されたコードを実行すると、表示されるメッセージがよりわかりやすくなります。,

記述的なエラーメッセージで終了したスクリプト

特定のエラーをキャッチする

キャッチオールエラー処理が最も適切なアプローチではない場合があります。 場合によっては、発生したエラーの種類に応じたアクションをスクリプトで実行する必要がある場合があります。

エラータイプをどのように判断しますか? 最後のエラーのTypeNameExceptionプロパティの値をチェックします。, たとえば、前の例のエラータイプを見つけるには、次のコマンドを使用します。

$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オブジェクトについて

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です