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.