Сегодня я впервые попробовал 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 действительно выявило все ошибки. Однако выполнение следующей команды из терминала по-прежнему не улавливает мои ошибки.
Из 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, но я не хочу указывать поведение ошибок для каждого вызываемого мной командлета, особенно потому, что перехват ошибок необходим для правильного функционирования код. (Кроме того, тот факт, что этот метод ДЕЙСТВИТЕЛЬНО работает, только еще больше сбивает меня с толку)
Каков правильный способ определения поведения обработки ошибок для всего скрипта и/или модуля?
Кроме того, вот моя таблица $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
$ErrorActionPreference = 'Stop'; Remove-Item -Verbose xxxxxx; echo hi
. Вы не ожидаете, чтоecho
будет выполнено, если файл xxxxxx не существует, но он выполняется. Если вы удалите-Verbose
, то он будет работать как положено. - person dan-gph   schedule 21.01.2014$ErrorActionPreference = 'Stop'
в начало почти всех своих скриптов, и он работает, как и ожидалось. Но в этом случае (и в вашем) это не сработало. Вот почему я думаю, что это ошибка. - person dan-gph   schedule 22.01.2014