Я впервые выпустил PowerShell (v3.0) сегодня и стал чрезвычайно расстроен странным способом реализации некоторых из его концепций обработки ошибок.
Я написал следующий фрагмент кода (используя модуль удаленного реестра PowerShell)
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 $_
}
(Это всего лишь фрагмент)
По-видимому, поведение PowerShell по умолчанию заключается в том, чтобы НЕ ловить ошибки, которые не заканчиваются. Поэтому я добавил следующую строку в верхней части моего script, как рекомендовано разными людьми:
$ErrorActionPreference = "Stop"
Выполнение этого в PowerShell ISE действительно устранило все ошибки. Однако выполнение следующей команды с терминала по-прежнему не вызывает ошибок.
Из 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.
Из командной строки:
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
Я понятия не имею, почему поведение переменных предпочтений ведет себя по-разному в зависимости от того, откуда они вызваны, тем более что ISE, похоже, выполняет ту же самую команду?
Основываясь на другой обратной связи, я изменил следующую строку:
New-RegKey -ComputerName $PCName -Key $Key -Name $Value
To:
New-RegKey -ComputerName $PCName -Key $Key -Name $Value -ErrorAction Stop
Используя этот метод, я смог уловить ошибки как из командной строки, так и из ISE, но я не хочу указывать поведение ошибки для каждого вызова, который я вызываю, особенно потому, что улавливание ошибок имеет важное значение для правильное функционирование кода. (Кроме того, тот факт, что этот метод работает, только пугает меня еще больше)
Каков правильный способ определения поведения обработки ошибок для области всего script и/или модуля?
Кроме того, здесь моя $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