Estoy usando la función de captura de Powershell porque me gustaría generar información de error completa cuando hay un error y tengo que responder al error. Sin el uso de una trampa, Powershell no me mostrará la información del error hasta después del error (y cualquier mensaje de consulta al que respondí).
El problema con el uso de la función de captura es que, aunque puedo imprimir la información completa, $error[0]
no sé cómo copiarla en una cadena y obtener la información completa. En lugar de eso, solo obtengo información breve.
Por ejemplo, esto muestra la información completa:
$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
Pero si intento usar $error[0] de Write-Host, solo muestra una breve información del error:
$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
Quiero mostrar la información completa del error de la trampa con color, por eso necesito Write-Host.
Respuesta1
Cuando se usa $Error[0]
dentro de una cadena, ToString()
se llama implícitamente y devuelve solo la cadena de error. Úselo Out-String
para obtener el resultado de error completo:
trap {
Write-Host -ForegroundColor Red -BackgroundColor Black "$($Error[0] | Out-String)"
Read-Host "Press enter"
}
o utilizar Write-Error
en su lugar:
trap {
Write-Error $Error[0]
Read-Host "Press enter"
}