Estou usando o recurso trap do Powershell porque gostaria de gerar informações completas sobre o erro quando houver um erro e precisar responder ao erro. Sem o uso de uma armadilha, o Powershell não me mostrará as informações do erro até depois do erro (e qualquer prompt de consulta ao qual eu respondi).
O problema de usar o recurso trap é que, embora eu possa imprimir as informações completas, $error[0]
não consigo descobrir como copiá-las para uma string e obter as informações completas. Em vez disso, recebo apenas informações breves.
Por exemplo, isso mostra as informações completas:
$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
Mas se eu tentar usar $error[0] do Write-Host, ele mostrará apenas breves informações de erro:
$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
Quero mostrar todas as informações de erro da armadilha com cores, e é por isso que preciso do Write-Host.
Responder1
Quando usado $Error[0]
dentro de uma string, ToString()
é chamado implicitamente, retornando apenas a string de erro. Use Out-String
para obter a saída de erro completa:
trap {
Write-Host -ForegroundColor Red -BackgroundColor Black "$($Error[0] | Out-String)"
Read-Host "Press enter"
}
ou use Write-Error
em vez disso:
trap {
Write-Error $Error[0]
Read-Host "Press enter"
}