'status de saída' de um pipeline do powershell

1

Como faço para verificar o sucesso / falha de um pipeline de dentro do mesmo script de execução?

Get-VM -Name Machine | Get-Snapshot | Where {$_.Created -lt (Get-Date).AddDays(-1)} | Remove-Snapshot -Confirm:$false

Não preciso de nada além do equivalente a $? .

    
por Yolo Perdiem 28.08.2013 / 16:24

3 respostas

2

Concorde com a abordagem try ... catch, mas o if ($?) {} também funciona bem, mas não detectará exceções que normalmente lançariam o script completamente.

De qualquer forma, um dos pontos strongs do PowerShell é também um dos seus pontos fracos. Estou falando de pipelining. Sim, é ótimo que você possa transmitir objetos pelo canal, mas quando o script está sendo executado na produção e você precisa falhar graciosamente, criar um log significativo, retornar um código de retorno significativo, possivelmente SMS da pessoa em espera e talvez até mesmo executar um trabalho de recuperação, um canal que acaba de vomitar no 50º objeto que encontrou, quando há outro 70 para ir não é de muita utilidade.

Em um script de produção, recomendo enfaticamente que você faça o "trabalho de canalização". Ou seja, use o poder do pipeline para reunir sua fila de trabalho (Get-VM | Where-Object, blah, blah) e enfie-a em uma matriz de objetos.

Em seguida, use um Foreach-Object para percorrer os objetos em sua fila de trabalho. Dentro do Foreach-Object, use o seu try ... catch quando se trata de coisas como Remove-Snapshot, e interrogue o objeto de exceção retornado para fornecer seu código de retorno / arquivo de log / alerta / sequência de recuperação, etc.

    
por 28.08.2013 / 23:11
1

Bem, o Powershell tem $ ?, então estou assumindo que o problema é que ele só é preenchido na saída?

Quando você está lidando com erros na execução de código, a prática recomendada é usar um bloco Try / Catch . Código dentro de um bloco "Try" irá falhar automaticamente para "Catch" em caso de problemas, e, melhor ainda, você pode ter diferentes blocos de captura para diferentes exceções, para que você possa lidar com diferentes problemas em tempo real. Muito legal.

    
por 28.08.2013 / 16:49
1

Como já foi dito, a abordagem segura é usar blocos Try / Catch:

try
{
    Get-VM -Name Machine | Get-Snapshot | Where {$_.Created -lt (Get-Date).AddDays(-1)} | Remove-Snapshot -Confirm:$false
}
catch
{
    # Rainbows, unicorns and error handling here
}

Se você estiver atribuindo a saída a uma variável e quiser testar a saída por conta própria, você pode colocar o bloco try / catch em uma subexpressão e tê-la como padrão em $null ou $false após uma falha, como esta :

$results = $( try{Get-Something "MaybeNonexisting"} catch{$false} )

if(-not($results))
{
    # more unicorns
    Write-Host ("Something awful happened: {0}" -f $Error[0])
}
    
por 28.08.2013 / 20:00