PowerShell - установка $ErrorActionPreference для всего script

Я впервые выпустил 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

Ответ 1

Поскольку вы используете V3, у вас также есть возможность использовать $PSDefaultParameterValues:

$PSDefaultParameterValues += @{'New-RegKey:ErrorAction' = 'Stop'}

Обычно это изменяет его в глобальной области. Если вы хотите изолировать его только от локальной или script области, вы можете сначала инициализировать новую в локальной области:

$PSDefaultParameterValues = @{}
$PSDefaultParameterValues += @{'New-RegKey:ErrorAction' = 'Stop'}

Если вы хотите наследовать то, что уже находится в родительской области, а затем добавить к ней для локальной области:

 $PSDefaultParameterValues = $PSDefaultParameterValues.clone()
 $PSDefaultParameterValues += @{'New-RegKey:ErrorAction' = 'Stop'}

Чтобы установить значение errorAction по умолчанию для всех командлетов, а не только New-RegKey, укажите '*:ErrorAction' вместо 'New-RegKey:ErrorAction' в приведенном выше коде.