Powershell - トラップ内の完全なエラー情報をコピーするにはどうすればいいですか

Powershell - トラップ内の完全なエラー情報をコピーするにはどうすればいいですか

エラーが発生し、そのエラーに応答する必要がある場合に、完全なエラー情報を出力したいので、Powershell のトラップ機能を使用しています。トラップを使用しないと、Powershell はエラーが発生するまで (および応答した Inquire プロンプトまで) エラー情報を表示しません。

トラップ機能を使用する場合の問題は、完全な情報を印刷することはできるものの、$error[0]それを文字列にコピーして完全な情報を取得する方法がわからないことです。代わりに、簡単な情報しか取得できません。

たとえば、完全な情報を表示するには次のようにします。

$ErrorActionPreference = "Stop"
trap {$error[0]; Read-Host -Prompt "Trapped. Press Enter to exit"}
Split-Path -BAD
echo "Running script"
Read-Host -Prompt "Press Enter to exit"

Split-Path : A parameter cannot be found that matches parameter name 'BAD'.
At line:3 char:12
+ Split-Path -BAD
+            ~~~~
    + CategoryInfo          : InvalidArgument: (:) [Split-Path], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.SplitPathCo 
   mmand

Trapped. Press Enter to exit: 

Split-Path : A parameter cannot be found that matches parameter name 'BAD'.
At line:3 char:12
+ Split-Path -BAD
+            ~~~~
    + CategoryInfo          : InvalidArgument: (:) [Split-Path], ParentContainsErrorRecordExce 
   ption
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.SplitPathCo 
   mmand

しかし、Write-Hostから$error[0]を使用しようとすると、簡単なエラー情報のみが表示されます。

$ErrorActionPreference = "Stop"
trap {Write-Host -ForegroundColor Red -BackgroundColor Black "$($error[0])"; Read-Host -Prompt "Trapped. Press Enter to exit"}
Split-Path -BAD
echo "Running script"
Read-Host -Prompt "Press Enter to exit"

A parameter cannot be found that matches parameter name 'BAD'.
Trapped. Press Enter to exit: 

Split-Path : A parameter cannot be found that matches parameter name 'BAD'.
At line:3 char:12
+ Split-Path -BAD
+            ~~~~
    + CategoryInfo          : InvalidArgument: (:) [Split-Path], ParentContainsErrorRecordExce 
   ption
    + FullyQualifiedErrorId : NamedParameterNotFound,Microsoft.PowerShell.Commands.SplitPathCo 
   mmand

トラップからの完全なエラー情報を色付きで表示したいので、Write-Host が必要です。

答え1

$Error[0]文字列内で使用すると、ToString()暗黙的に呼び出され、エラー文字列のみが返されます。Out-String完全なエラー出力を取得するには、次のように使用します。

trap {
    Write-Host -ForegroundColor Red -BackgroundColor Black "$($Error[0] | Out-String)"
    Read-Host "Press enter"

}

またはWrite-Error代わりに以下を使用します:

trap {
    Write-Error $Error[0]
    Read-Host "Press enter"

}

関連情報