uma das partes-chave de qualquer script PowerShell bom é o tratamento de erros. Mesmo no script mais curto, ser capaz de lidar com erros ajuda a garantir que um evento inesperado não vai continuar a destruir o sistema em que você está trabalhando. Veja o exemplo abaixo. Todas as semanas na nossa empresa de amostra (MyCompany.Com os recursos humanos vão fazer upload de uma lista que nos diz Quem deve ter acesso à base de dados de despesas., Se um nome não estiver na lista de RH, vamos removê-lo do grupo e esse usuário não será mais capaz de registrar reivindicações de despesas:
Agora, você pode ver onde isso vai correr mal. Uma semana a HR não consegue fazer o upload da lista ou, assim como estamos prestes a aceder à lista, o servidor de arquivos morre. De repente, o PowerShell lança um erro no ‘Get-Content cmdlet’ e a variável $AuthorizedUser permanece vazia. Como nosso script não lida com erros, ele continua a correr e, em um espaço de tempo muito curto, ele removeu todos os usuários de nosso grupo de despesas., Muito em breve, as chamadas telefónicas iradas começam a inundar-se e a vida fica um pouco menos feliz. A maneira de evitar tudo isso é pegar os erros e, em seguida, lidar com o evento que os causou (que, neste caso, é parar o script e ter um grito para alguém em HR).
erros de terminação e não terminação
uma das coisas-chave para saber quando erros de captura é que apenas certos erros podem ser capturados por padrão. Os erros vêm em dois tipos-terminação e não terminação. Um erro de terminação é um erro que irá parar uma função ou operação., Se você fizer um erro de sintaxe ou ficar sem memória, isso é um erro de terminação. Erros de terminação podem ser capturados e manuseados. Erros não terminantes permitem que o Powershell continue e geralmente vêm de cmdlets ou outras situações gerenciadas. Em circunstâncias normais, não podem ser apanhados pela tentativa-captura-finalmente. O erro Get-Content no exemplo acima é um erro de não-terminação.
tratar os erros sem terminação como terminando
então como você pega um erro sem terminação? Basicamente, dizes ao PowerShell para o tratar como um fim. Para fazer isso, você usa o parâmetro ErrorAction., Todos os cmdlet PowerShell suportam erros. Ao especificar-ErrorAction Stop no final de um cmdlet você garante que todos os erros que ele lança são tratados como terminação e pode ser pego. Em nosso exemplo acima, nós vamos mudar o nosso Get-Content linha:
$AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop
o Tratamento de Todos os Erros como Terminação
também é possível tratar todos os erros como terminar usando a variável ErrorActionPreference. Você pode fazer isso tanto para o script que você está trabalhando com ou para toda a sessão PowerShell. Para colocá-lo em um script, faça a primeira linha $ErrorActionPreference = Stop., Para configurá-lo para a sessão, digite $ErrorActionPreference = pare na consola PowerShell.
capturando um erro de terminação
Depois de ter assegurado que o erro que está a tentar apanhar vai ser tratado como terminando, você pode criar um bloco de captura de tentativa em torno do comando (ou comandos) que pode causar o erro. A primeira etapa é rodear a seção de seu script que pode lançar o erro com um bloco de tentativa. No nosso exemplo, a linha Get-Content torna-se:
Try{ $AuthorizedUsers= Get-Content \\ FileServer\HRShare\UserList.txt -ErrorAction Stop}
imediatamente após o bloco de tentativa, você deve colocar um bloco de captura para lidar com o erro., O bloco de Catch só é acessado se ocorrer um erro de terminação, caso contrário ele é ignorado. No nosso exemplo, vamos enviar um e-mail a um administrador para dizer que houve um erro e, em seguida, parar o script. A nossa linha Get-Content é agora:
acessando o registro de erro
Uma vez que você está dentro de um bloco de captura você pode acessar o registro de erro, que é armazenado na variável objeto atual, $_. Os registos de erros têm várias propriedades úteis, mas o principal a que vai querer aceder é $_.Excepcao., Exceções são o que estamos realmente lidando com aqui como pegamos e lidamos com erros – exceções são o evento inesperado que causou o erro (o registro de erro em si é realmente apenas um invólucro para apresentar a exceção ao usuário PowerShell). É a excepção que estamos a apanhar e a excepção que contém todas as informações realmente úteis sobre o problema. Se houve um outro problema subjacente que causou a nossa exceção, ele também é registrado em $_.excepcao.innerexception (and so on – the next underlying exception is stored at $_.excepcao.innerexcepção.,innerexception etc.). Para os propósitos de nosso exemplo nós vamos usar $_.Exceção para colocar algumas informações extras em nosso email de notificação, usando o $_.Excepcao.Mensagem e$_.Excepcao.ItemName properties:
capturando exceções específicas
agora, como o nosso exemplo está estamos pegando quaisquer erros que ocorrem durante o arquivo lido e lidando com todos eles da mesma forma. Você pode, no entanto, pegar exceções específicas e lidar com elas de forma diferente, mas – e é um grande mas – somente se o erro original está terminando., Porque o cmdlet Get-Content lança erros de não-terminação (que nós só temos tratado como terminando usando ErrorAction) não podemos especificamente pegar as diferentes exceções que o cmdlet pode lançar. Esta é uma característica do PowerShell e aplica-se a qualquer erro de não-terminação, independentemente da preferência de erro e não pode ser alterada. Ainda assim, podemos lidar com outras exceções finais, como um erro de memória, que pode aparecer durante a operação de leitura. Para efeitos deste exemplo, é isso que vamos fazer.,
Você captura erros de terminação específicos, especificando o nome da exceção imediatamente após a palavra-chave de captura. No nosso exemplo, queremos apanhar um sistema.E, se conseguirmos uma, teremos a abordagem sem disparates de reiniciar o computador imediatamente. Nós também incluiremos um bloco de captura geral após o nosso arquivo não encontrado bloco para pegar todas as outras exceções:
finalmente, usando finalmente
a última parte da tentativa de captura Finalmente é o bloco final. Isto deve ser definido imediatamente após o bloco de captura e funciona sempre, independentemente de haver ou não um erro., Desta forma, você pode realizar ações que precisam ser feitas, independentemente de uma operação ser bem sucedida ou falhar. No nosso exemplo, vamos registar que um ficheiro lido foi tentado. A nossa linha Get-Content agora se parece com: