Como usar o PowerShell, tente capturar finalmente para lidar com erros
Um PowerShell Tente pegar block é usado para lidar com erros no script do PowerShell. Ao usar o PowerShell Tente pegar bloco para script, você pode obter o seguinte:
- Faça com que seu script continue em execução apesar de um erro
- Exiba e lide melhor com mensagens de erro
Neste guia, você aprenderá como usar o Powershell Tente pegar blocos para lidar com mensagens de erro de encerramento no PowerShell. Além disso, você aprenderá a incluir o Finalmente bloquear em um Tente pegar quadra.
O guia começa com a sintaxe do Tente pegar quadra.
Procurar tópicos de postagem
- Sintaxe de captura de tentativa do PowerShell
- Tipos comuns de erros de exceção no PowerShell Try Catch
- Como capturar exceções específicas com o PowerShell Try Catch
- Como incluir um bloco Finalmente na instrução Try Catch do PowerShell
- Informações úteis adicionais sobre o PowerShell Try Catch
- Como limpar o PowerShell Tente Capturar $ Error Automatic Variable
- Como exibir uma mensagem de erro personalizada no PowerShell Try Catch Block
- Como obter informações de CategoryInfo de erro no PowerShell Try Catch
- Como usar o Write-Host para exibir mensagens de erro no PowerShell Try Catch
- Como criar uma tabela de hash em um bloco de captura do PowerShell
- Exemplos de tentativa de captura do PowerShell
- Referências e Leituras Adicionais
PowerShell Tente pegar Sintaxe
A sintaxe do PowerShell Tente pegar é…
|_+_|
O Experimentar é a parte do bloco que você deseja que o PowerShell monitore quanto a erros. Este é o bloco com os scripts originais que podem retornar um erro de finalização.
Quando ocorre um erro no bloco Try, o PowerShell salva o erro na variável automática $Error (mais sobre isso posteriormente).
Por outro lado, t ele pegar declaração do PowerShell Tente pegar block trata os erros gerados no bloco try. Você também pode especificar os tipos de erros que são tratados dentro do Pegar bloco de instruções.
O Finalmente block pode ser usado para liberar quaisquer recursos que não sejam mais necessários para o script.
Tipos comuns de erros de exceção no PowerShell Tente pegar
Você pode lidar com diferentes tipos de erros em um bloco Try Catch do PowerShell. Por exemplo, você pode lidar com erros específicos.
Além disso, você pode manipular mensagens de erro genéricas. No entanto, para lidar com tipos específicos de erros, você precisa conhecer o tipo de erro.
posteriormente neste guia, você aprenderá que as mensagens de erro são salvas na variável automática $error. Além disso, os erros também podem ser salvos na variável de pipeline $_.
melhor addon chinês kodi
Além disso, os erros salvos na variável automática $error são salvos em um array. Para ajudar a explicar isso, vamos executar um comando que retorna uma mensagem de erro final:
Para limpar todos os erros salvos anteriormente no $erro variável automática, antes de executar o comando abaixo, primeiro, execute $erro.Limpar() comando. |_+_| Não há log de eventos chamado Systerr, portanto, o comando no bloco Try lançará uma mensagem de erro.Surpreendentemente, o comando não exibiu nenhuma mensagem de erro. Então, o que aconteceu com a mensagem de erro?
Ele é salvo na variável automática $error! Para exibir o erro do último comando, salvo na variável $error, execute o comando…
|_+_|O resultado do comando exibe os detalhes do erro salvos na variável automática $error. As informações de erro têm uma seção chamada FullyQualifiedErrorId .
Para este erro específico, o FullyQualifiedErrorId tem dois conjuntos de informações - System.InvalidOperationException e Microsoft.PowerShell.Commands.GetEventLogCommand .
A informação que nos interessa é System.InvalidOperationException . Este é um tipo de erro que você pode pegar no bloco Tentar Captura do PowerShell.
Para obter o nome dessa exceção do PowerShell, execute o comando abaixo:
|_+_|Aí está, System.InvalidOperationException !
Nas próximas subseções, discutirei erros comuns de exceção de tentativa de captura do PowerShell.
PowerShell Tente Capturar CommandNotFoundException Erro
Se você executar um comando que não existe no PowerShell ou no Prompt de Comando da Microsoft, receberá uma mensagem de erro. Por exemplo, se você executar o Get-File comando, você receberá uma mensagem de erro porque esse comando não é um cmdlet do PowerShell válido.
Aqui está uma captura de tela do resultado do comando no PowerShell…
Como você pode ver na captura de tela, o tipo de exceção (FullyQualifiedErrorId ) é CommandNotFoundException .
Como este é um erro de encerramento, ele impedirá que seu script continue. Para impedir que esse erro encerre seu script, envolva o comando em um Tente pegar quadra.
addon fox news kodi
Se agruparmos esse erro em um bloco Try Catch do PowerShell, o PowerShell suprimirá o erro. Além disso, ele interromperá o encerramento do seu script.
No entanto, mesmo que o erro seja suprimido, ele é salvo na variável $error. Como de costume, antes de executar o comando abaixo, primeiro limpe os erros salvos na variável $error.
|_+_|Se você deseja executar o comando no PowerShell em vez do PowerShell ISE, digite os comandos em uma única linha, conforme mostrado abaixo:
|_+_|Então, para exibir o erro, execute…
|_+_|
Como mencionei na introdução principal desta seção, para exibir o ID da exceção desse erro, execute o comando abaixo:
|_+_|O nome completo da exceção é System.Management.Automation.CommandNotFoundException .
PowerShell Tente Capturar ManagementObjectNotFoundException Erro
Quando você executa um comando em uma sessão PS remota com as informações erradas, o PowerShell retorna um ManagementObjectNotFoundException erro.
Um cenário típico é quando você se conecta ao Office 365 com o PowerShell. Em seguida, execute o comando Get-User, mas forneça o usuário errado identidade .
Para capturar esse erro com o PowerShell Try Catch, use um comando semelhante ao abaixo:
|_+_| Pegando o ManagementObjectNotFoundException erro com o PowerShell Try, Catch é particularmente complicado. Você tem que usar o ErrorAction parâmetro e especifique Pare . Caso contrário, mesmo com o Try, Catch, o erro ainda será exibido.Por fim, para obter o nome da exceção, use o comando abaixo:
|_+_|O comando retorna o tipo de exceção como System.Management.Automation.RemoteException . Então, o que é ManagementObjectNotFoundException ?
ManagementObjectNotFoundException é o motivo da exceção conforme confirmado pelo comando abaixo:
|_+_|
PowerShell Tente Capturar UnauthorizedAccessException Erro
Outro erro de exceção comum do PowerShell é UnauthorizedAccessException . Esse tipo de erro é gerado quando você tenta acessar um item que não possui pelo menos uma permissão de leitura.
Para ilustrar este exemplo, neguei aos usuários autenticados o acesso a um arquivo específico em meu computador.
Agora, se eu tentar acessar o arquivo com o comando Get-Content, recebo uma mensagem de acesso negado.
|_+_|
Para interromper a exibição desse erro, execute o comando no bloco PowerShell Try Catch, conforme mostrado abaixo…
|_+_|Infelizmente, o comando acima não interrompe a exibição do erro. A razão é que não é um erro de encerramento.
Para interromper a exibição do erro, inclua o ErrorAction parâmetro e especifique Pare .
|_+_|Agora, o comando suprime o erro. Para exibir o tipo de exceção, execute o comando abaixo…
|_+_|O tipo de exceção é System.UnauthorizedAccessException .
Existem mais tipos de erros de exceção do que os abordados nesta seção. Eu cobri apenas os tipos mais comuns de exceções.Como capturar exceções específicas com o PowerShell Try Catch
A última seção discutiu exceções comuns do PowerShell e como encontrar o tipo de exceção. Esta seção abordará como usar essas informações para capturar tipos específicos de mensagens de erro.
Na seção de sintaxe deste guia, eu disse que a sintaxe geral de um PowerShell Try Catch Finalmente é…
|_+_|No bloco catch da sintaxe, você pode ver o [tipo de erro]. É aqui que você especifica o tipo de erro que deseja capturar neste bloco.
Por exemplo, para capturar erros UnauthorizedAccessException, use as instruções abaixo…
|_+_|Para executar o comando no PowerShell, especifique as instruções em uma única linha. A primeira parte da instrução – $error.Clear() – limpa todos os erros salvos na variável $error.
|_+_|Como adicionar vários Pegar Blocos em um PowerShell Tente pegar Declaração
Na introdução desta seção, mostrei como capturar um tipo específico de exceção no Pegar quadra. Você pode especificar vários
Aqui está um exemplo…
|_+_|Neste exemplo, o primeiro pegar block trata os tipos especificados de exceções. Além disso, o segundo pegar block handles trata de erros genéricos.
Como extrair a exceção de erro com o PowerShell Try Catch
A última subseção abordou como especificar vários blocos catch para lidar com diferentes tipos de exceções. Nesta subseção, você aprenderá como extrair os detalhes do erro em uma exceção.
o que está na fila do gmail
Para ilustrar isso, vou usar um exemplo que usei anteriormente. Execute esta instrução do PowerShell no PowerShell.
|_+_|Agora execute o $error sozinho…
|_+_|Embora várias informações sejam salvas na variável $error, a mensagem de erro real é destacada na captura de tela abaixo.
Se você quiser registrar este erro em um arquivo de texto, você só precisa registrar os detalhes reais do erro. Para extrair este erro, use o comando abaixo:
|_+_|O comando extrai a mensagem de erro real O acesso ao caminho ‘D:PS-Tutorialfolder-names.txt’ é negado.
Você pode gravar esta mensagem de erro em um arquivo de log incluindo um Arquivo de saída comando no bloco Catch.
|_+_| Eu incluí o Acrescentar parâmetro no Arquivo de saída comando para permitir o registro de várias entradas sem substituir as entradas anteriores.Para facilitar o entendimento do último comando, vou reescrevê-lo no formato de script abaixo…
|_+_|Como incluir um Finalmente Bloquear para PowerShell Tente pegar Declaração
Você pode incluir um Finalmente bloquear para PowerShell Tente pegar Declaração. A sintaxe é
|_+_|O finalmente block pode ser usado para liberar quaisquer recursos que não sejam mais necessários para o script.
Um bloco Finalmente é executado mesmo se você usar CTRL+C para parar o script. O bloco também será executado se uma palavra-chave Exit interromper o script de dentro de um bloco Catch.No último exemplo, eu tinha a instrução que grava o log de erros em um arquivo de texto no Pegar quadra. No entanto, o melhor lugar para ter essa declaração é em um Finalmente quadra.
Veja o script modificado abaixo…
|_+_|Informações úteis adicionais sobre o PowerShell Try Catch
Nesta seção, compartilharei algumas informações simples, mas úteis, sobre o PowerShell Try Catch.
Como limpar o PowerShell Tente Capturar $ Error Automatic Variable
A variável automática $error tem um Claro Método. Você pode usar este método para limpar todos os erros salvos na variável automática $error.
Para limpar todos os erros salvos na variável automática $error para a sessão atual do PowerShell, execute o comando abaixo.
|_+_|Como exibir uma mensagem de erro personalizada no PowerShell Try Catch Block
Para exibir uma mensagem de erro personalizada em um bloco Try Catch do PowerShell, use a palavra Throw. Aqui está um exemplo…
|_+_|Aqui está o resultado deste script no PowerShell ISE.
Como obter informações de CategoryInfo de erro no PowerShell Try Catch
A variável automática $error tem uma propriedade chamada CategoryInfo. Para ver esta propriedade e outras propriedades e Métodos, execute o comando abaixo…
|_+_|Uma das propriedades retornadas pelo último comando é chamada Informações da categoria .
Para acessar essas informações, execute o comando abaixo.
|_+_|Este comando retorna várias subpropriedades.
Cada uma dessas subpropriedades pode ser acessada adicionando o nome das subpropriedades após um ponto. Por exemplo, para exibir as subpropriedades do Reason, execute o comando abaixo.
|_+_|
Como usar o Write-Host para exibir mensagens de erro no PowerShell Try Catch
Assim como a propriedade CategoryInfo na última subseção, a variável automática $error também possui uma propriedade chamada Exceção . Para exibir a exceção em um erro, execute o comando abaixo:
|_+_|
Infelizmente, se você tentar exibir essas informações com o comando Write-Host, ele não funcionará conforme o esperado.
|_+_|Aqui está o resultado deste comando no PowerShell…
Como você pode ver, o comando exibe várias outras informações. A boa notícia é que $error.Exception tem outra propriedade chamada Mensagem .
Você pode chamar essa subpropriedade anexando-a a $error.Exception , como isso…
|_+_|Além disso, você pode usar Host de gravação comando para exibir essas informações de erro…
|_+_|O último comando agora exibe a mensagem de erro real…
Exceto que há uma razão específica para usar Host de gravação como mostrado no último comando, você pode simplesmente exibir a mesma mensagem de erro com $error.Exception comando.Como criar uma tabela de hash em um bloco de captura do PowerShell
Existem duas maneiras comuns de criar um Tabela de hash do PowerShell em um bloco Try Catch.
- Você pode criar uma tabela de hash com vários pares de chave/valor dentro do bloco Try
- Como alternativa, você pode criar uma única tabela de hash de chave/valor com o Chave fora da Tente Catc h bloco e o valor dentro do Tente Catc bloco h.
Aqui está um exemplo do primeiro método…
|_+_|Como você pode ver, o hasttable está dentro do Tente Catc h bloco…
Por outro lado, você pode criar uma única chave hashtable com o valor definido em um Tente Catc bloco h. Aqui está um exemplo…
|_+_|Para confirmar que o último script produz uma tabela de hash do PowerShell, depois de executar o script, chamei os valores salvos na variável $hashtable.
Como você pode ver pelo resultado do último comando, ele tem um par Nome/Valor!
Exemplos de tentativa de captura do PowerShell
Nesta seção final, abordarei vários exemplos do aplicativo do PowerShell Try Catch.
Como usar o PowerShell Tente pegar Com Get-Childitem
O comando Get-Childitem pode retornar vários erros. Para ilustrar os dois erros comuns, usarei os dois comandos abaixo:
|_+_|O caminho correto para o arquivo de texto usado no último comando é D:PS-Tutorialfilelist.txt.
No entanto, no primeiro comando incluí um espaço após D:PS-Tutorial. Isso resultou em um erro (determinaremos os detalhes do erro em breve).
como esconder o que você está tocando no Steam
Além disso, no segundo comando, especifiquei o caminho correto, mas usei o nome de arquivo errado. Isso resultou em um erro.
|_+_|
Seguindo em frente, para obter mais informações sobre esses erros, executarei os comandos em um PowerShell Tente pegar quadra.
|_+_|Nossa primeira tarefa é determinar os tipos de erro retornados pelos comandos. Para obter essas informações, execute os comandos abaixo…
|_+_|Aqui estão os resultados dos comandos…
Erros salvos na variável automática $error são armazenados em uma matriz do PowerShell. Cada objeto na matriz é acessado adicionando um [0], [1] no final da matriz. 0 representa o primeiro item na matriz enquanto 1 representa o segundo item e assim por diante.Voltar para obter mais informações sobre os erros lançados pelo Get-Childitem comando, com base nos tipos de erro, podemos modificar nosso bloco Try Catch para capturar esses 2 tipos de erros…
|_+_|Nossa segunda tarefa é exibir as mensagens de erro reais. Este comando fará o trabalho:
|_+_|O comando exibe as duas mensagens de erro…
Como usar o PowerShell Tente pegar Para exportar erros Get-WMIObject com Export-csv
Nesta subseção, exportarei os erros gerados ao executar Get-WMIObject em um computador remoto em um arquivo CSV com o Export-csv comando.
Primeiro, vamos ver os detalhes do erro gerados quando você tenta se conectar a um computador remoto offline com Get-WMIObject . Para ilustrar isso execute o comando abaixo…
|_+_|O comando gerou uma mensagem de erro porque Computador não é um nome de PC válido.
Posso jogar jogos Wii no switch?
Seguindo em frente, para gerenciar o erro, executarei o comando dentro do Experimentar bloco de um Tente pegar declaração.
|_+_|Na primeira linha do Experimentar bloco, defini a variável $ComputerName. Então, na segunda linha, eu corri o Get-WmiObject comando.
Além disso, no Pegar bloco, criei os detalhes do erro exportei para um arquivo CSV com Export-csv .
Aqui está uma explicação detalhada do script no Experimentar quadra:
- Na linha 1, criei uma variável $path que especifica onde quero salvar o arquivo CSV
- Então, na linha 2, usei o comando Get-Date para criar um nome de arquivo para o arquivo CSV. O nome do arquivo está no formato, aaaaMMdd_HHmmss.csv
- Na linha 3, criei um objeto vazio salvo em uma variável chamada $data
- Então, na linha 4 eu adicionei a coluna ‘Computer Name’ no objeto que criei na linha 3. A coluna pega a variável $ComputerName
- Na linha 5, adicionei o volume ‘Error Message’ que irá salvar as mensagens de erro, $error.Exception.Message
- Então, na linha 6, criei uma variável $csvfilepath que combina as variáveis $path e $csvfilename para criar um caminho completo para o arquivo CSV
- Finalmente, na linha 7, canalizei as informações salvas na variável $data ($ComputerName e $error.Exception.Message) para Export-csv e salvei o arquivo em $csvfilepath
A captura de tela abaixo mostra o CSV criado pelo script…
Como capturar erros de processo de obtenção com o PowerShell Tente pegar Declaração
Se você executar o comando Get-Process com um ID de processo que não existe, ele retornará um Microsoft.PowerShell.Commands.ProcessCommandException erro.
Para capturar esse tipo específico de exceção, execute um comando semelhante ao abaixo:
|_+_|Aqui está o resultado do script no PowerShell ISE.
Como alternativa, você pode definir uma mensagem de erro personalizada modificando o script conforme mostrado abaixo…
|_+_|Agora o script retorna a mensagem de erro personalizada…
Como capturar erros de Get-Mailbox com o PowerShell Tente pegar Declaração
Se você se conectar ao Office 365 PowerShell e executar o Get-Mailbox contra um usuário que não existe, você receberá uma mensagem de erro. Alguns usuários relataram ter problemas para capturar a mensagem de erro em Get-Mailbox comando.
Para testar este cenário, após conectar-se ao nosso Conta do Office 365 via PowerShell, executei o script abaixo:
|_+_| O usuário Pius não existe em nossa conta do Office 365.O script retornou a mensagem de erro A operação não pôde ser executada porque o objeto 'Pius' não foi encontrado em 'AM6PR05A05DC002.EURPR05A005.PROD.OUTLOOK.COM '.
Aqui está a captura de tela…
No entanto, se Tente pegar detectar o erro, tente adicionar o tipo de exceção conforme mostrado no comando modificado abaixo:
|_+_|É isso – nosso guia abrangente e atualizado sobre o PowerShell Tente Pegar Final mente! Espero que tenha achado útil?
Se você achou útil, por favor, vote sim para a pergunta Foi este post útil abaixo.
Alternativamente, você pode fazer uma pergunta, deixar um comentário ou fornecer mais feedback com o formulário Deixe uma resposta encontrado no final desta página.
Por fim, para obter mais zonas S de tecnologia do PowerShell, visite nossa página de guia de instruções do Windows PowerShell. Você também pode achar nossa página Work from Home muito útil.
Referências e Leituras Adicionais
- Sobre Try Catch Finalmente
- Sobre a Armadilha
- Matriz do PowerShell e adicionar à matriz: aplicativos e exemplos
- Powershell para loop explicado: sintaxe e exemplos

