Adam o Automator

alguma vez executou um script ou um PowerShell cmdlet e foi confrontado com uma parede gritante de texto – a vermelho – como o mostrado abaixo?

Exemplo de erros no PowerShell

Erros podem se tornar esmagadora e confuso. E acima de tudo, os erros são muitas vezes difíceis de ler, o que torna quase impossível determinar o que e onde o script correu mal.,

felizmente, você tem algumas opções em PowerShell para fazer isso melhor através do tratamento de erros. Usando o manuseio de erros, os erros podem ser filtrados e exibidos de tal forma que é mais fácil fazer sentido. E, compreender o erro torna mais fácil adicionar mais lógica ao manuseio de erros.

neste artigo, você vai aprender sobre erros no PowerShell e como eles podem ser interpretados para efectuar o processamento de erros usando o PowerShell Try Catch blocos (e finally blocos).,

Table of Contents

Understanding How Errors Work in PowerShell

Before diving into error handling, let’s first cover a few concepts around errors in PowerShell. Compreender erros pode levar a melhores estratégias de tratamento de erros.

the $Error Automatic Variable

In PowerShell, there are a lot of automatic variables, and one of them is the $Error automatic variable. PowerShell usa a variável

para armazenar todos os erros que são encontrados na sessão., A variável $Error é uma matriz de erros ordenados pela mais recente.

Quando você abre pela primeira vez uma sessão PowerShell, a variável$Error está vazia. Você pode verificá-lo chamando a variável $Error.

O $variável de Erro é vazio

Como você pode ver, o $Error variável começa vazio., Mas, uma vez que um erro é gerado, o erro será adicionado e armazenado na variável

.

no exemplo abaixo, o erro é gerado por obter deliberadamente um nome de serviço que não existe.

PS> Get-Service xyzPS> $ErrorPS> $Error.Count
O erro é adicionado para o $variável de Erro

Como você pode ver a saída acima, o erro gerado foi adicionado para o $Error variável.,

a variável $Error contém uma coleção de erros gerados na sessão PowerShell. Cada erro pode ser acessado chamando sua posição de array. O último erro será sempre no índice 0.

Por exemplo, o último erro pode ser obtido usando $Error.

the $Error Object Properties

Since everything in PowerShell is an object, the $Error variable is an object, and objects have properties., Ao canalizar a variável$Error para a variávelGet-Member cmdlet, deverá ver a lista das propriedades disponíveis.

$Error | Get-Member
O Erro $propriedades do objecto

Para determinar o motivo para o erro, você pode exibir o conteúdo de InvocationInfo propriedade usando o comando abaixo.,

$Error.InvocationInfo
O InvocationInfo propriedade

Agora, você poderia fazer o mesmo com as outras propriedades e descobrir o que outras informações você pode encontrar!

erros de terminação

erros de terminação parar o fluxo de execução quando é encontrado por PowerShell vs erros de não-terminação. Há várias maneiras de um erro de terminação pode ocorrer. Um exemplo é quando você chama um cmdlet com um parâmetro que não existe.,

Como irá a partir da imagem abaixo, quando o comando Get-Process notepad correr, o comando é válido e os detalhes do processo do bloco de notas são apresentados.

O bloco de notas do processo detalhes

Mas, quando um parâmetro que não existe é usado como o Get-Process notepad -handle 251 o cmdlet exibe um erro que o handle parâmetro não é válido. Em seguida, o cmdlet sai sem mostrar os detalhes do processo notepad.,

Erro é apresentada porque o parâmetro é inválido

Não-Erros de encerramento

Não-encerramento erros são erros que não interrompa a execução do script ou comando. Por exemplo, confira o código abaixo. Este código recebe a lista de nomes de arquivos da lista de arquivos.ficheiro txt. Em seguida, o script vai através de cada nome de arquivo, ler o conteúdo de cada arquivo, e outputs-lo na tela.

$file_list = Get-Content .\filelist.txtforeach ($file in $file_list) { Write-Output "Reading file $file" Get-Content $file}

o conteúdo da filelista.,o ficheiro txt são os nomes dos ficheiros que aparecem na lista abaixo.

File_1.logFile_2.logFile_3.logFile_4.logFile_5.logFile_6.logFile_7.logFile_8.logFile_9.logFile_10.log

mas e se File_6.o log não existia? Quando você executa o código, você esperaria um erro irá acontecer porque o script não consegue encontrar o File_ 6.log. Você verá uma saída semelhante mostrada abaixo.

Exemplo de erro de não-encerramento

Como você pode ver na captura de tela do resultado acima, o script foi capaz de ler os cinco primeiros arquivos na lista, mas quando ele tentou ler o arquivo File_6.,txt, um erro é devolvido. O script então continuou a ler o resto dos arquivos antes de sair. Não terminou.

O $ErrorActionPreference Variável

até agora, você aprendeu sobre a terminar e não terminar erros e como eles diferem uns dos outros. Mas, sabia que um erro de não-terminação pode ser forçado a ser tratado como um erro de terminação?

PowerShell tem um conceito chamado variáveis de preferência. Estas variáveis são usadas para mudar como PowerShell se comporta de muitas maneiras diferentes. Uma destas variáveis é chamada $ErrorActionPreference.,

a variável$ErrorActionPreference é usada para alterar a forma como o PowerShell trata erros não terminantes. Por padrão, o valor $ErrorActionPreference é definido como Continue. Alterando o valor da variável

variável para STOPforça PowerShell a tratar todos os erros como erros de terminação.

utilize o código abaixo para alterar o valor $ErrorActionPreference.,

$ErrorActionPreference = "STOP"

Para saber mais sobre outros válida $ErrorActionPreference valores de variáveis, visite PowerShell ErrorActionPreference.

agora, remete para o exemplo usado na secção de erros não terminantes neste artigo. O script pode ser modificado para incluir a alteração $ErrorActionPreference como o código mostrado a seguir:

a Executar a modificação de código acima irá se comportar de forma diferente do que antes, quando o $ErrorActionPreference valor é definido para o valor padrão de Continue.,

Forçando um erro de encerramento usando o $ErrorActionPreference variável

Como você pode ver na captura de tela do resultado acima, o script foi capaz de ler os cinco primeiros arquivos na lista, mas quando ele tentou ler o arquivo File_6.txt, um erro é devolvido porque o arquivo não foi encontrado. Então, o script terminou, e o resto dos arquivos não são lidos.,

o $ErrorActionPreference o valor só é válido na sessão PowerShell actual. Ele reinicia para o valor padrão, uma vez que uma nova sessão PowerShell é iniciada.

O ErrorAction Comum Parâmetro

Se $ErrorActionPreference valor é aplicado para a sessão do PowerShell, o ErrorAction parâmetro se aplica a qualquer cmdlet oferece suporte a parâmetros comuns. O parâmetro ErrorAction aceita os mesmos valores que a variável $ErrorActionPreference.,

O valor do parâmetro ErrorAction tem precedência sobre o valor $ErrorActionPreference.

vamos voltar e usar o mesmo código no exemplo anterior. But, this time, the ErrorAction parameter is added to the Get-Content line.

Depois de executar o código modificado, você vai ver que, embora o $ErrorActionPreference está definido para Continue, o script que ainda não terminou, uma vez que encontrou um erro., O programa terminou porque o valor do parâmetro -ErrorAction em Get-Content é definido como STOP.

Forçando um erro de encerramento usando o ErrorAction parâmetro

a Utilização do PowerShell Tentar Blocos Catch

neste ponto, você aprendeu sobre PowerShell erros, e como o $ErrorActionPreference variável e ErrorAction parâmetros de trabalho., Agora, é hora de você aprender sobre o bom material – o PowerShell Try Catch Finally blocos.

PowerShelltry catch blocks (and optionalfinally block) are a way to cast a net around a piece of code and catch any errors that return.

o código abaixo mostra a sintaxe da declaração Try.

try { <statement list>}catch *]{ <statement list>}finally { <statement list>}

o Try bloco contém o código que deseja que o PowerShell “tente” e monitorize os erros., Se o código no bloco Try encontra um erro, o erro é adicionado ao bloco $Error e depois passado para o bloco Catch.

The Catchblock contains the actions to execute when it receives an error from theTry block. Pode haver vários blocos Catch em uma declaração Try.

The Finallyblock contains that code that will at the end of theTry., Este bloco corre se um erro foi ou não contado.

a Captura Não-Específicos de Erros (Catch-All)

Um simples Try instrução contém um Try e uma Catch bloquear. O bloco Finally é opcional.por exemplo, para obter uma excepção não específica, o parâmetro Catch deve estar vazio. O código de exemplo abaixo está usando o mesmo script que foi usado na seção da variável $ ErrorActionPreference, mas modificado para usar o Try Catch blocos.,

Como pode ver a partir do código abaixo, desta vez, a declaração foreach está dentro do bloco Try. Então, um bloco

contém o código para exibir a string An Error Occurred se ocorreu um erro. O código no bloco Finally apenas limpa a variável $Error.

o código acima, após correr em PowerShell, dar-lhe-á esta saída mostrada em baixo.,

Script terminou quando ocorreu um erro

A saída acima mostra que o script encontrou um erro, correu o código dentro da tag Catch bloquear e, em seguida, terminada.

o erro foi tratado, que foi o ponto de manipulação de erros. No entanto, o erro apresentado era demasiado Genérico. Para mostrar um erro mais descritiva, você poderia acessar o Exception propriedade do erro que foi passado pelo Try bloquear.,

O código a seguir é modificado, especificamente o código dentro da tag Catch bloco, para exibir a mensagem da exceção de erro atual que foi passado para o pipeline – $PSItem.Exception.Message

Neste momento, quando modificado o código acima é executado, a mensagem exibida é muito mais descritivo.,

Script terminou com uma mensagem de erro descritiva

a Captura de Erros Específicos

Há vezes quando um pega-tudo manipulação de erro não é a abordagem mais adequada. Talvez, você queira que seu script execute uma ação que é dependente do tipo de erro que é encontrado.

Como você determina o tipo de erro? Ao verificar o TypeName valor do Exception propriedade do último erro., Por exemplo, para encontrar o tipo de erro do exemplo anterior, use este comando:

$Error.Exception | Get-Member

O resultado do código acima ficaria como a imagem abaixo. Como você pode ver, o valor TypeName é mostrado – System.Management.Automation.ItemNotFoundException.

Obtendo o erro TypeName valor

Agora que você sabe o tipo de erro que você precisa interceptar, modifique o código para pegá-lo especificamente., Como você vê a partir do código modificado abaixo, Existem agora doisCatch blocos. O primeiroCatch intercepta um tipo específico de erro (System.Management.Automation.ItemNotFoundException). Em contraste, o segundo bloco Catch contém a mensagem genérica de erro “catch-all”.

A imagem abaixo mostra o resultado do código modificado acima.,

Script terminou com uma mensagem de erro específico

Conclusão

neste artigo, você aprendeu sobre erros no PowerShell, suas propriedades, e como você pode determinar um erro do tipo específico. Você também aprendeu a diferença entre como a variável $ErrorActionPreference e a variável ErrorAction afeta como PowerShell trata erros não terminantes.,

Você também aprendeu a usar a PowerShell Try Catch Finally blocos para realizar o tratamento de erros, seja para erros específicos ou para uma abordagem catch-all.

os exemplos que são mostrados neste artigo apenas demonstram o básico de como o Try Catch Finally blocos funcionam. O conhecimento que eu espero que você tenha ganho neste artigo deve dar-lhe os blocos iniciais para começar a aplicar tratamento de erros em seus scripts.,

Ler Mais

  • About_Try_Catch_Finally
  • About_Automatic_Variables
  • de Volta ao Básico: O PowerShell Loop foreach
  • de Volta ao Básico: Compreensão PowerShell Objetos

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *