Conforme nossos scripts se tornem mais críticos temos que nos preocupar com o que pode ocorrer caso o script falhe, ou como o script vai se comportar em caso de falha. No Powershell podemos utilizar como solução para controlar os erros os comandos Try e Catch em nossos scripts, além disso podemos também configurar a opção de ErrorPreferenceAction e executar verificações nas variável $? e $Error[0]
Se você já esta habituado com algum ambiente shell (linux...) você talvez conheça essa variável, sempre que executamos qualquer cmdlet no Powershell ele armazena um resultado True ou False na variável $?, por exemplo execute o comando
Get-Process “HowToServer” $?
Como o comando falhou (o correu um erro) a variável $? continha o valor False, se o comando tivesse sido concluído com sucesso teriamos o valor True.
Get-Process “Notepad” $?
A variável $? sempre armazena o resultado do ultimo comando executado, por tanto após executar outro comando ele sera sobrescrita com o novo valor.
Lembrando que a variável $? armazena o True ou False conforme o resultado do comando se o comando não apresentar erros mas retornou um resultado que é um false, teríamos o valor True igual na variável $?.
Os comandos Try e Catch, também utilizados em outras linguagens, servem para manipular erros que parariam o script. Podemos executar determinada ação caso ocorra um erro, por exemplo utilizando o cmdlet Test-Connection para pingar um endereço
Try { Test-Connection 8.8.8.8 -ErrorAction Stop } Catch { write-host "Falhou ping" }
Utilizamos o parâmetro -ErrorAction para informamos que em caso de algum erro no comando Test-Connection queremos que o script pare, assim quando o Test-Connection apresentar o erro e for parar o script dentro do Try o Catch é executado.
Apesar de simples isso é de grande utilidade em nossos scripts.
Utilizando a variável $Error
A variável $Error é uma variável de ambiente que armazena as mensagens de erro que ocorreram na sessão Powershell, podemos utilizar ela para logarmos exatamente qual erro ocorreu ou enviarmos o erro por e-mail.
Na verdade $Error é um vetor e não uma simples variável, ele armazena todos os últimos erros que ocorreram podemos utilizado da seguinte forma.
Get-Process "HowToServer" Write-Host $Error
Podemos determinar a posição que queremos ver do vetor, utilizando [X] após a variável, podemos também limpar o conteúdo da variável $error.
$Error.Clear()
Caso nosso script apresente mais de um erro e queiramos verificar somente o primeiro erro.
Get-Process "HowToServer" Get-Process "MatheusKamphorst" write-host "Sem determinar a posição `n"$Error
Para determinarmos a posição que queremos e assim pegarmos somente o ultimo erro utilizamos
Write-Host $Error[0]
Configurando a ErrorPreferenceAction
Opção que determina o comportamento padrão que o Powershell tera quando um cmdlet retornar um erro, podendo ter como comportamento as opções:
SilentlyContinue, Oculta os erros e continuar a execução do script.
Stop, Finaliza a execução do script caso ocorra um erro.
Continue, Exibe o erro mas continua com a execução.
Inquire, Pergunta para o usuário qual ação ele quer tomar.
Ignore,Ignora os erros.
Essa opção pode ser configurada de duas formas diferentes, individualmente para cada comando ou a nível global na sessão Powershell.
Para configurar individualmente em cada comando basta adicionarmos o parâmetro -ErrorAction
Get-Process “HowToServer” -ErrorAction “Inquire”
Para configurar em nível de sessão basta configurar a variável de ambiente $ErrorPreferenceAction com o valor desejado.
$ErrorActionPreference = “SilentlyContinue” Get-Process “HowToServer”
Referencias
Os seguintes sites contém mais material sobre o assunto e podem ter sido utilizados como fonte.
http://blogs.technet.com/b/heyscriptingguy/archive/2010/03/11/hey-scripting-guy-march-11-2010.aspx
http://blogs.technet.com/b/heyscriptingguy/archive/2010/03/08/hey-scripting-guy-march-8-2010.aspx
http://blogs.technet.com/b/heyscriptingguy/archive/2010/03/09/hey-scripting-guy-march-9-2010.aspx
Este artigo foi originalmente escrito por: Matheus Kamphorst blog: http://howtoserver.com