PowerShellのTry/Catch/Finallyブロックを説明する

PowerShellのTry/Catchブロックは、スクリプトで生成されるエラーを処理することです。 具体的には、エラーはエラーを終了する必要があります。 PowerShellのFinallyブロックは、Try/Catchと共に毎回書き込むことは必須ではありませんが、エラーが発生したかどうかにかかわらず実行されます。したがって、Tryブロックを使用する場合、Catchブロックは必須ですが、Finallyブロックではありません。

  • Try/Catchブロックで終了エラー−以下はfinallyブロックなしで終了エラーの例です。,

Example

try{ This is not allowed "This is Allowed"}catch{ Write-Host "Error occured" -BackgroundColor DarkRed}

Output

上記の例では、許可されていないものを返しますが、終了エラーのために実行できませんでしたが、次の行

私たちの目標は、Tryブロックで生成された例外とエラーメッセージをキャッチすることです。 私たちが知っているように、エラーは$Error変数に格納されます。 $Error変数の出力を確認すると、ビュー全体を取得できますが、スクリプトを実行してエラーを処理するたびに、$errorを使用して古いエラーをクリアしてください。,clear()コマンドまたは新しいPowerShellコンソールを使用します。 配列内の特定のエラー変数の場所がわかっている場合は、それを直接使用できます。 たとえば、$error

$Error変数のすべてのプロパティが何であるかを確認できます。

PS C:\WINDOWS\system32> $Error | Get-Member | Select Name, MemberTypeName MemberType---- ----------Equals MethodGetHashCode MethodGetObjectData MethodGetType MethodToString MethodCategoryInfo PropertyErrorDetails PropertyException PropertyFullyQualifiedErrorId PropertyInvocationInfo PropertyPipelineIterationInfo PropertyScriptStackTrace PropertyTargetObject PropertyPSMessageDetails ScriptProperty

例外とエラーの詳細を見つけるのに役立つプロパティはほとんどありません。 それらを見てみましょうし、Catchブロックでも活用できます。

最初のInvocationInfoプロパティ。, また、$Errorを使用することもできますが、これはこれまでに生成された唯一のエラーなので、直接$Errorを使用していますが、$error変数で自動提案ポップアップを

PS C:\WINDOWS\system32> $Error.InvocationInfoMyCommand :BoundParameters : {}UnboundArguments : {}ScriptLineNumber : 3OffsetInLine : 5HistoryId : 50ScriptName :Line : This is not allowedPositionMessage : At line:3 char:5 + This is not allowed + ~~~~PSScriptRoot :PSCommandPath :InvocationName : ThisPipelineLength : 0PipelinePosition : 0ExpectingInput : FalseCommandOrigin : InternalDisplayScriptPosition :

以下に示すように、LineとPositionMessageから特定の情報を取得できます。

今すぐ例外プロパティをチェックしてください。

PS C:\WINDOWS\system32> $Error.ExceptionThe term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

例外メッセージ

PS C:\WINDOWS\system32>$error.Exception.MessageThe term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.

エラーメッセージを表示するのに役立つと思われる他のプロパティを使用できます。 エラーをキャッチするためにCatchブロックでこれらのいくつかを使用します。, 現在のエラーで作業しているので、$_を使用します。 現在のエラー/例外を処理する。

Output

Error Message: The term 'This' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.Error in Line: This is not allowedError in Line Number: 3Error Item Name:

上で見たようにFinallyブロックはありませんでしたが、Try/Catchは引き続き機能しました。 Finallyブロックを追加して変数とエラーをクリアし、メッセージを表示できます。

  • 終了エラーのあるTry/Catchブロック。,

上記の例で見たように、終了エラーはTry/Catchブロックで制御できますが、非終了エラーは組み込みのコマンドレットで生成されたエラーであり、エラーアクションのデフォルトの設定はContinueであり、エラーが処理されなくてもnextコマンドが実行され続けるため、終了エラーは制御できないことがわかりました。

PS C:\WINDOWS\system32> $ErrorActionPreferenceContinue

非終端エラーを終了エラーに強制するには、$ErrorActionPreference変数を停止するか、Stop値でErrorActionパラメータを使用する必要があります。, ここでは、スクリプト全体ではなく、特定のコマンドに必要なErrorActionパラメータを使用します。

Example

Output

Error Message: Cannot find any service with service name 'WhichService'.Error in Line: Get-Service WhichService -ErrorAction StopError in Line Number: 4Error Item Name:This is going to run anyway

上記の例でわかるように、Get-Serviceは非終了エラーを生成し、-ErrorAction Stopパラメータによって終了エラーに変換でき、同じ例外がCatchブロック

  • 特定の例外を手動で処理する

特定のタイプの例外を処理する場合は、catchブロックに例外名を指定できます。, 例外の名前を知るには、$Error変数のプロパティを取得する必要があり、それはGetType()です。 以下の例では、以下のエラー出力から例外名を見つける必要があります。

Example

エラーが$Error変数に格納されているとすると、以下のコマンドを実行して、使用する例外名をcatchブロックに取得する必要があります。

$Error.Exception.GetType().FullName
PS C:\WINDOWS\system32> $Error.Exception.GetType().FullNameSystem.Management.Automation.MethodInvocationException

上記のコマンドで例外タイプ名を取得した場合、catchブロックで同じものを使用できるため、catchブロックはその特定の例外のみをキャッチします。,

出力

  • 複数の例外PowerShellをキャッチします。

PowerShellで複数の例外をキャッチすることもできます。 そのためには、単一のTryブロックと複数のcatchブロックを使用できます。

出力

Cannot find path 'C:\temp\cominfo1.html' because it does not exist.Setting up ErrorActionPreference to the Default value

ここでは、最初のコマンドで、次のコマンドは実行されませんので、それ自体エラーが生成されました。 最初のコマンドがエラーを生成しない場合、次のコマンドがチェックされ、例外が発生した場合、その特定の例外ブロックでキャッチが実行されます。,

複数の例外を処理したくない場合でも、いくつかのコマンドが必要な場合は、エラーは無視できますが、次のコマンドが実行できるようにcatchブロックを通過しないようにしてください。ErroractionパラメーターでIgnoreまたはSilentlyIgnoreを使用できます。

に掲載06月期2020年に16:36:12
広告

コメントを残す

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

ツールバーへスキップ