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

Сегодня мы впервые попробовали 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 - НЕ отлавливать ошибки, которые не заканчиваются. Поэтому я добавил следующую строку в верхней части моего сценария, как рекомендовали разные люди:

$ErrorActionPreference = "Stop"

Выполнение этого в PowerShell 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

Для того, чтобы:

New-RegKey -ComputerName $PCName -Key $Key -Name $Value -ErrorAction Stop

Используя этот метод, я смог отловить ошибки как из командной строки, так и из ISE, но я неЯ не хочу указывать поведение ошибок в каждом вызываемом командлете, особенно потому, что перехват ошибок важен для правильного функционирования кода. (Плюс, тот факт, что этот метод работает, только запутывает меня еще больше)

Как правильно определить поведение обработки ошибок для области действия всего сценария и / или модуля?

Также здесь's my $ 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)

Ваш ответ на вопрос