PowerShell で Try-Catch ブロックを使用してエラーを処理する

Marion Paul Kenneth Mendoza 2023年6月20日
  1. PowerShell の $ErrorActionPreference 変数
  2. PowerShell の ErrorAction 共通パラメーター
  3. PowerShell try-catch ブロックを使用する
PowerShell で Try-Catch ブロックを使用してエラーを処理する

コード エラーは読みにくいことが多く、スクリプトの何がどこで間違っていたのかを突き止めることはほとんど不可能です。 PowerShell には、エラー処理を改善するためのいくつかのオプションがあります。

この記事では、PowerShell のエラー アクション設定と、PowerShell の Try-Catch ブロック (および Finally ブロック) を使用してエラー処理を実行するためにそれらをインターセプトする方法について説明します。

PowerShell の $ErrorActionPreference 変数

設定変数は PowerShell の概念であり、これらの変数はさまざまな方法で PowerShell の動作を変更するために使用されます。 $ErrorActionPreference 変数は、これらの変数の 1つです。

変数 $ErrorActionPreference は、PowerShell が非終了エラーを処理する方法を制御します。 $ErrorActionPreference 値は、デフォルトで "Continue" に設定されています。

$ErrorActionPreference 変数が "Stop" に設定されている場合、PowerShell はすべてのエラーを終了エラーとして扱います。 以下のスニペットを使用して、$ErrorActionPreference 値を変更します。

$ErrorActionPreference = "Stop"

PowerShell の ErrorAction 共通パラメーター

ErrorAction パラメーターは、$ErrorActionPreference 値が PowerShell セッションに適用される場合、共通パラメーターをサポートするすべてのコマンドに適用されます。 ErrorAction 引数の値は、$ErrorActionPreference 変数の値と同じです。

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

コード例:

$ErrorActionPreference = "Continue"
$files = Get-Content .\files.txt
foreach ($file in $files) {
    Write-Output "Reading file $file"
    # Use the -ErrorAction common parameter
    Get-Content $file -ErrorAction STOP
}

変更したコードを実行すると、$ErrorActionPreference"Continue" に設定されていても、エラーが発生するとスクリプトが終了することがわかります。 Get-Content の PowerShell ErrorAction パラメーター値が "Stop" に設定されていたため、スクリプトは終了しました。

PowerShell try-catch ブロックを使用する

今度は、PowerShell の Try-Catch-Finally ブロックについて学習します。 PowerShell の 'Try-Capture' (およびオプションの 'Finally') ブロックを使用すると、コードの一部をブロックでラップして問題をキャッチできます。

コード例:

try {
    <statement list>
}
catch [[<error type>][',' <error type>]*]{
    <statement list>
}
finally {
    <statement list>
}

PowerShell で Try して障害を監視するコードは、Try ブロックにあります。 Try ブロックでコードを実行中にエラーが発生した場合、エラーは $Error 変数に保存され、Catch ブロックに転送されます。

Try ブロックがエラーを返した場合、Catch ブロックは実行する手順を提供します。 Try ステートメントには、複数の Catch ブロックを含めることができます。

そのコードは、Finally ブロックの Try ステートメントの最後にあります。 スクリプトがエラーをカウントしたかどうかにかかわらず、このブロックが実行されます。

単純な Try ステートメントには、TryCatch の 2つのブロックがあります。 Final はオプションのブロックです。

不特定の例外をキャッチするには、Capture オプションを空にする必要があります。 以下のコード例の $ErrorActionPreference 変数部分のスクリプトは、Try Catch ブロックを使用するように調整されています。

foreach ステートメントは、下の Try ブロック内に含まれるようになりました。 'Catch' ブロックには、エラーが発生した場合に文字列 "An Error Occurred" を表示するコードが含まれています。

最後に、Finally ブロック コードは $Error 変数をクリアします。

コード例:

$files = Get-Content .\files.txt
try {
    foreach ($file in $files) {
        Write-Output "Reading file $file"
        Get-Content $file -ErrorAction STOP
    }
}
catch {
    Write-Host "An Error Occured" -ForegroundColor RED
}
finally {
    $Error.Clear()
}

出力:

An Error Occured
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn