エラーが発生し、そのエラーに応答する必要がある場合に、完全なエラー情報を出力したいので、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"
}