Na maioria das vezes, o relatório de erros no PowerShell é muito útil. Vejo erros, vejo a origem, mas notei que quaisquer erros nos pipelines ForEach-Object perdem sua linha de origem e a pilha de erros simplesmente aponta para a linha de código com a extensão ForEach-Object
.
Exemplo de localização de erro incorreta
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
[cultureinfo]::CurrentUICulture = 'en-US'
function Test-Something($val)
{
# var is not defined here
Write-Host($undefined_variable)
}
@("a","b") | ForEach-Object{
$entry = $_
Test-Something $entry
}
Resulta em
ForEach-Object : The variable '$undefined_variable' cannot be retrieved because it has not been set.
In D:\dummy.ps1:12 Line:14
+ @("a","b") | ForEach-Object{
+ ~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (undefined_variable:String) [ForEach-Object], RuntimeException
+ FullyQualifiedErrorId : VariableIsUndefined,Microsoft.PowerShell.Commands.ForEachObjectCommand
A linha 12
aponta para @("a","b") | ForEach-Object{
, que obviamente não é o local do erro.
Exemplo muito mais utilizável com foreach
Agora estou usando um foreach
(apenas as últimas 4 linhas de código foram alteradas)
Set-StrictMode -Version Latest
$ErrorActionPreference = "Stop"
[cultureinfo]::CurrentUICulture = 'en-US'
function Test-Something($val)
{
# var is not defined here
Write-Host($undefined_variable)
}
$data = @("a","b")
foreach($entry in $data)
{
Test-Something $entry
}
O erro agora é muito mais utilizável, na verdade aponta para a linha de erro 9
paraWrite-Host($undefined_variable)
The variable '$undefined_variable' cannot be retrieved because it has not been set.
In D:\dummy.ps1:9 Line:16
+ Write-Host($undefined_variable)
+ ~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (undefined_variable:String) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : VariableIsUndefined
Isso está relacionado à natureza da tubulação dos operadores do gasoduto ou estou entendendo algo errado. O primeiro cenário torna o rastreamento de erros muito difícil quando há mais funções entre eles. Na maioria dos casos, posso mudar, foreach
mas adoraria entender o que realmente está acontecendo.