Powershell - Como posso copiar informações completas de erro em uma armadilha

Powershell - Como posso copiar informações completas de erro em uma armadilha

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-Stringpara 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-Errorem vez disso:

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

}

informação relacionada