alguma vez executou um script ou um PowerShell cmdlet e foi confrontado com uma parede gritante de texto – a vermelho – como o mostrado abaixo?
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
.
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
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
Para determinar o motivo para o erro, você pode exibir o conteúdo de InvocationInfo
propriedade usando o comando abaixo.,
$Error.InvocationInfo
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.
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
.,
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.
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 STOP
forç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
.,
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
.
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 Catch
block 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 Finally
block 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.,
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.,
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
.
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.,
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