Como o nome indica, o PowerShell é muito mais poderoso do que o prompt de comando padrão do Windows. Com esse poder vem uma maior possibilidade de erros confusos. Se o seu script de repente falhar, você pode não saber onde começar a procurar pelo que deu errado. É aqui que a manipulação de erros do PowerShell vem a calhar.
Se está familiarizado com outras línguas, provavelmente sabe o básico do tratamento de erros, mas há alguns aspectos específicos do PowerShell que precisa de saber. Existem quatro partes para manipulação de erros no PowerShell: o parâmetro Error Action, o parâmetro Try/Catch blocks, o parâmetro Error Variable, e o log.
PowerShell Error Handling the Easy Way
O primeiro passo para lidar com os erros do PowerShell é lidar com algo que pare o seu script em suas pistas. Se a falha não afectar o resto do seu script, talvez seja melhor apenas dizer ao PowerShell para ignorar os erros e seguir em frente.
Por outro lado, nem sempre é claro quando um determinado cmdlet lança um erro de terminação. Alguns cmdlets retornam um erro mas não param o seu script. Isto pode deixá-lo à espera que o seu script termine enquanto ele produz disparates.
Aqui é onde entra o parâmetro -ErrorAction. Você usa isto para forçar um cmdlet para lidar com o erro da maneira que você quiser. Se você estiver modificando um script existente, você o anexa ao final da linha cmdlet.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop
Obviamente, se você está usando a cmdlet Get-ChildItem por si só, este erro não faz muito por você. No entanto, se você quiser fazer alguma coisa com os dados, seria bom parar o script, então você sabe que a busca falhou e por quê. Alternativamente, se você estiver fazendo múltiplas buscas, mude o parâmetro de Stop para SilentlyContinue, para que o script continue se a busca falhar. Se você quiser ver qual é o erro, você pode usar Continue como o parâmetro.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction SilentlyContinue
Se você preferir ter a opção de controlar o que acontece cada vez que seu script é executado, você pode alterá-lo para Inquire. Quando o seu cmdlet atinge um obstáculo, ele dá opções: Sim, Sim Para Todos, Comando Parar, Suspender, ou Ajuda.
Esta opção é um pouco mais flexível mas significa que erros fazem com que o seu script espere pela sua entrada. Isso é bom se você estiver usando PowerShell para enviar um e-mail ou alguma outra tarefa simples, mas pode não ser algo que você queira quando você estiver executando um longo processo da noite para o dia.
PowerShell Error Handling the Powerful Way
O parâmetro ErrorAction aborda os seus erros de uma forma descomplicada. No entanto, se você está procurando um pouco mais de controle sobre os erros, PowerShell ainda tem você coberto. Usando Try/Catch, podemos agora ramificar o script quando cmdlets retorna um erro.
Como o nome sugere, Try/Catch é composto de duas partes. (Tecnicamente existe uma terceira, mas chegaremos a isso num minuto.) A primeira é a secção Try. Você vai correr o seu código normal nesta secção. Você ainda vai usar o parâmetro -ErrorAction, mas ele só pode ser definido como Stop. Esta bandeira assegura que o seu cmdlet aciona o Catch – mesmo que ele não tenha um erro de terminação.
Try{
Get-Process "Cortana" -ErrorAction Stop
}
Tente também pode impedir que outros cmdlet rodem se a busca falhar. Neste caso, se você estava enviando os resultados do Get-Process para o Stop-Process, uma busca falhada impede que o segundo cmdlet seja executado.
Então, agora que você criou um bloco de cmdlets, o que você quer fazer quando ele falhar? Usando a metade do Catch, você vai definir isso.
Catch{
Write-Host "Process Not Found"
}
Como no parâmetro ErrorAction, quando você estiver fazendo algo um pouco mais complexo o Catch será útil para mais do que dar uma falha em linguagem simples, especialmente quando você estiver fazendo algo um pouco mais complexo. (No exemplo acima, a falha é forçada usando o nome do aplicativo, e não o nome do processo). Portanto, certifique-se de jogar com o bloco Try para criar uma busca/ação que você precisa. Você pode usar o bloco Catch do seu script para lhe enviar um e-mail se ele falhar.
A terceira parte vem a calhar se quiser que algo corra independentemente de o seu cmdlet ter ou não sucesso. Para isso, você pode usar o bloco Finalmente. Você adiciona isto depois de Try and Catch e registra quando uma seção do seu script termina.
A Variável de Erro e Registo
O seu script agora controla como lida com os erros e como responde a eles. Você pode usá-lo como uma tarefa agendada, ou pelo menos executá-lo quando você não estiver em sua mesa. No entanto, como você pode investigar um script que falhou? Com o parâmetro -ErrorVariable os erros do seu cmdlet escrevem para uma variável personalizada.
Esta é uma alternativa à variável $Error do sistema, que contém todos os erros da sessão atual.
Seu cmdlet precisa ficar um pouco mais longo. Primeiro, defina uma variável, algo como $SearchError servirá para o exemplo. Quando você chama SearchError no parmetro ErrorVariable, você não usa o sinal do dólar.
Mesmo que você esteja chamando uma variável que você criou, devido à forma como o parâmetro funciona, você a chama sem o sinal do dólar. Depois acrescente isso ao final da linha.
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Continue -ErrorVariable SearchError
Se você adicionar um + na frente do nome da variável, você pode adicionar à variável ao invés de substituí-la diretamente. Isso dá-lhe o mesmo comportamento que a variável de erro global. Em vez disso, você pode usar essa saída e Try/Catch para escrever uma saída personalizada, e marcá-la com um carimbo de data e hora.
Para fazer isso funcionar, crie um arquivo de texto logo após definir a variável de erro. Faça isso com o New-Item cmdlet. Você pode querer usar a opção Inquire para o parâmetro ErrorAction. Isto permite-lhe adicionar a um log existente quando o New-Item cmdlet falha.
$SearchLog = New-Item "~\SearchLog.txt" -type file -ErrorAction Inquire
Agora quando você constrói seu bloco Try/Catch, você pode usar o Catch para fazer o log em um arquivo de texto. Você usa o Get-Date para criar o timestamp. A formatação pode ser complicada, por isso não se esqueça de copiar isso do exemplo.
Try{
Get-ChildItem -Path "~\Documents\*.jpg" -Recurse -ErrorAction Stop -ErrorVariable SearchError
}
Catch{
Add-Content -Path $SearchLog -Value "$(Get-Date -Format dd-MM-yy-hh_mm_ss) Files not found returned error: $SearchError"
}
Repita isso conforme necessário para todos os seus cmdlets, e agora você tem um bom registro de quaisquer erros. Se você quiser rastrear coisas que rodam com sucesso você pode adicionar um Add-Content similar no final do bloco Try.
Este log só corre quando o seu cmdlet Try tem sucesso. Você pode então registar os seus erros e sucessos com carimbos de tempo. O registo agora permite-lhe saber tudo o que o seu script tem feito, sucesso ou fracasso.
O PowerShell não é a sua única opção
Embora o PowerShell seja uma ferramenta útil para muitas tarefas do Windows, pode ser difícil de aprender. Também não é adequado para tudo. Se está a fazer manutenção do sistema no seu computador ou a verificar a integridade de um ficheiro, o PowerShell é útil. Por outro lado, se você está procurando executar um script para baixar arquivos da internet ou alguma tarefa mais geral, você tem outras opções.
Por exemplo, se você vem de um fundo Unix ou Linux, você pode estar mais confortável usando a shell bash. Graças ao Subsistema Windows para Linux, você pode agora facilmente usar o bash e outras ferramentas Linux no seu computador com Windows 10. Se isso lhe parece perfeito, não procure mais longe do que o nosso guia para ter a bash shell a funcionar no Windows 10.
Kris Wouk é um músico, escritor, e como quer que se chame quando alguém faz vídeos para a web. Um entusiasta da tecnologia desde que se lembra, ele definitivamente tem sistemas operacionais e dispositivos favoritos, mas usa tantos outros quanto pode, de qualquer forma, só para ficar preso.
More From Kris Wouk