PowerShell - Definindo $ ErrorActionPreference para o script inteiro
Estive testando o PowerShell (v3.0) pela primeira vez hoje e fiquei extremamente frustrado com a maneira estranha como alguns de seus conceitos de tratamento de erros são implementados.
Escrevi o seguinte trecho de código (usando o Remote PowerShell Module)
try
{
New-RegKey -ComputerName $PCName -Key $Key -Name $Value
Write-Host -fore Green ($Key + ": created")
}
catch
{
Write-Host -fore Red "Unable to create RegKey: " $Key
Write-Host -fore Red $_
}
(Este é apenas um trecho)
Aparentemente, o comportamento padrão do PowerShell é NÃO detectar erros que não terminem. Então, adicionei a seguinte linha na parte superior do meu script, conforme recomendado por várias pessoas:
$ErrorActionPreference = "Stop"
Executar isso no PowerShell ISE realmente capturou todos os erros. No entanto, a execução após o comando do terminal ainda não captura meus erros.
Do ISE:
PS C:\windows\system32> C:\Data\Scripts\PowerShell\Error.ps1
Errorhandling: Stop
SOFTWARE\MySoftware does not exist. Attempting to create
Unable to create RegKey: SOFTWARE\MySoftware
Key 'SOFTWARE\MySoftware' doesn't exist.
Na linha de comando:
PS C:\Data\Scripts\PowerShell> .\Error.ps1
Errorhandling: Stop
SOFTWARE\MySoftware does not exist. Attempting to create
New-RegKey : Key 'SOFTWARE\MySoftware' doesn't exist.
At C:\Data\Scripts\PowerShell\Error.ps1:17 char:13
+ New-RegKey -ComputerName $PCName -Key $Key -Name $Value
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
+ FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,New-RegKey
SOFTWARE\MySoftware: created
Não faço ideia por que o comportamento das Variáveis de Preferência se comporta de maneira diferente, dependendo de onde elas são chamadas, principalmente porque o ISE parece executar exatamente o mesmo comando?
Com base em outros comentários, alterei a seguinte linha:
New-RegKey -ComputerName $PCName -Key $Key -Name $Value
Para:
New-RegKey -ComputerName $PCName -Key $Key -Name $Value -ErrorAction Stop
Usando esse método, consegui capturar erros da linha de comando e do ISE, mas não quero especificar o comportamento do erro em cada cmdlet que chamo, principalmente porque a captura de erros é essencial para o bom funcionamento do o código. (Além disso, o fato de esse método funcionar apenas serve para me confundir ainda mais)
Qual é a maneira correta de definir o comportamento de tratamento de erros para o escopo de um script e / ou módulo inteiro?
Além disso, aqui está minha $ PSVersionTable:
PS C:\Data\Scripts\PowerShell> $PSVersionTable
Name Value
---- -----
PSVersion 3.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.18408
BuildVersion 6.2.9200.16481
PSCompatibleVersions {1.0, 2.0, 3.0}
PSRemotingProtocolVersion 2.2