PowerShell: Como posso impedir que erros sejam exibidos em um script?


92

Quando meu script do PowerShell tenta, por exemplo, criar um objeto do SQL Server para um servidor que não existe ("bla" no meu caso), o PowerShell exibe muitos erros do PowerShell em vermelho.

Como meu script verifica o valor de $?após essas chamadas e exibe e registra erros, prefiro não ter as várias linhas de erros do PowerShell exibidas também.

Como posso desativar aqueles que estão sendo exibidos para o meu script?

Respostas:


132

Você tem algumas opções. O mais fácil envolve usar as ErrorActionconfigurações.

-Erroractioné um parâmetro universal para todos os cmdlets. Se houver comandos especiais que você deseja ignorar, você pode usar os -erroraction 'silentlycontinue'quais basicamente ignorarão todas as mensagens de erro geradas por aquele comando. Você também pode usar o Ignorevalor (no PowerShell 3+):

Ao contrário de SilentlyContinue, Ignore não adiciona a mensagem de erro à variável automática $ Error.

Se você deseja ignorar todos os erros em um script, pode usar a variável de sistema $ErrorActionPreferencee fazer a mesma coisa:$ErrorActionPreference= 'silentlycontinue'

Consulte about_CommonParameters para obter mais informações sobre -ErrorAction. Consulte about_preference_variables para obter mais informações sobre $ ErrorActionPreference.


você precisa de aspas simples em -erroraction 'silencentlycontinue'? Intellisese está mostrando opções e não adicionando aspas simples.
PAS

1
Se o formato acima não funcionar para você, consulte o link fornecido acima. Tive que formatar como -ErrorAction:SilentlyContinueno PS 5.1. Eu estava chamando meu cmdlet do batch, então não sei se isso faz diferença. Mas boas informações quando você sabe que um erro aceitável podem ser lançadas.
David

--rm. \ Windows.old \ -Force -Recurse -Verbose -ErrorAction SilentlyContinue -WarningAction SilentlyContinue </code>
Tertius Geldenhuys

18

O Windows PowerShell fornece dois mecanismos para relatar erros: um mecanismo para erros de encerramento e outro mecanismo para erros de encerramento .

O código CmdLets interno pode chamar um ThrowTerminatingErrormétodo quando ocorre um erro que não permite ou não deve permitir que o cmdlet continue a processar seus objetos de entrada. O redator do script pode usar exceção para detectar esses erros.

EX:

try
{
  Your database code
}
catch
{
  Error reporting/logging
}

O código CmdLets interno pode chamar um WriteErrormétodo para relatar erros de não finalização quando o cmdlet pode continuar processando os objetos de entrada. O gravador do script pode então usar a opção -ErrorAction para ocultar as mensagens ou usar o $ErrorActionPreferencepara configurar todo o comportamento do script.


8

Tive um problema semelhante ao tentar resolver nomes de host usando [system.net.dns]. Se o IP não foi resolvido, o .Net gerou um erro de encerramento. Para evitar o erro de encerramento e ainda manter o controle da saída, criei uma função usando TRAP.

POR EXEMPLO

Function Get-IP 
{PARAM   ([string]$HostName="")
PROCESS {TRAP 
             {"" ;continue} 
             [system.net.dns]::gethostaddresses($HostName)
        }
}

3

Você está muito fora do caminho aqui.

Você já tem uma boa mensagem de erro grande. Por que diabos você iria querer escrever um código que verifica $?explicitamente após cada comando ? Isso é extremamente complicado e sujeito a erros. A solução correta é parar de verificar$? .

Em vez disso, use o mecanismo integrado do PowerShell para explodir por você. Você o habilita definindo a preferência de erro para o nível mais alto:

$ErrorActionPreference = 'Stop'

Eu coloco isso no topo de cada script que já escrevi e agora não tenho que verificar $?. Isso torna meu código muito mais simples e confiável.

Se você se deparar com situações em que realmente precisa desativar esse comportamento, pode cometer catcho erro ou passar uma configuração para uma função específica usando o comum -ErrorAction. No seu caso, você provavelmente deseja que o processo pare no primeiro erro, identifique o erro e registre-o.

Observe que isso não resolve o caso quando os executáveis ​​externos falham (código de saída diferente de zero, convencionalmente), então você ainda precisa verificar $LASTEXITCODEse invoca algum. Apesar dessa limitação, a configuração ainda economiza muito código e esforço.

Confiabilidade adicional

Você também pode usar o modo estrito :

Set-StrictMode -Version Latest

Isso evita que o PowerShell proceda silenciosamente quando você usa uma variável inexistente e em outras situações estranhas. (Consulte o -Versionparâmetro para obter detalhes sobre o que ele restringe.)

Combinar essas duas configurações torna o PowerShell muito mais uma linguagem fail-fast, o que torna sua programação muito mais fácil.


2

Adicione -ErrorAction SilentlyContinueao seu script e você estará pronto para ir.


2

Em alguns casos, você pode canalizar após o comando um Out-Null

command | Out-Null

-1

Se você deseja que a mensagem de erro do PowerShell para um cmdlet seja suprimida, mas ainda deseja detectar o erro, use "-erroraction 'silentlyStop'"


Não existe tal ação. Embora haja uma ação Stop.
Marvin Dickhaus

Mas permite suprimir a mensagem de erro vermelho e ainda usar o comando / seção catch ao usar New-Item -ItemType directory(PowerShell v2.0)
Milan Kerslager

@MilanKerslager poderia gentilmente mostrar um exemplo de código - já que eu, e todos os outros, acreditamos que não existe ActionPreference como 'SilentlyStop'
FSCKur

Estou razoavelmente confiante de que Mikkel quis dizer SilentlyContinue em vez de silentlyStop, porque isso faz muito mais sentido no conteúdo do que você deseja que ele faça.
John
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.