Я бы сделал вот что.
- Установите несколько
Try/Catch block
по мере необходимости. - Группируйте несколько вызовов командлетов в один блок, когда это возможно. Как вы упомянули, мы не хотим сгруппировать все в один гигантский
try/catch
блок, но все же связанные вызовы могут go вместе. - Создавайте свои встроенные функции как расширенные функции, чтобы вы могли использование общих параметров, таких как ...
-ErrorAction
- Установите
$PSDefaultParameterValues = @{'*:ErrorAction'='Stop'}
, чтобы все командлеты, поддерживающие -ErrorAction
, не попадали в блок try/catch
.
(Вы также можете вручную установить -ErrorAction Stop
везде, но, поскольку вы хотите, чтобы это было по умолчанию, имеет смысл сделать это таким образом. В любом случае вы не хотите трогать $ErrorActionPreference
, так как он имеет глобальную область действия и ваш пользователям не понравится, если вы измените значения по умолчанию за пределами области действия модуля.)
Вы также можете перенаправить поток ошибок в файл, чтобы вместо того, чтобы отображаться в выводе, он записывался в файл.
Вот самодостаточный пример этого:
& {
Write-Warning "hello"
Write-Error "hello"
Write-Output "hi"
} 2>> 'C:\Temp\redirection.log'
Подробнее об этом см. About_Redirection .
(Теперь мне интересно, можете ли вы перенаправить поток не на файл
* 1 034 * Дополнительное примечание
Внешние модули также могут помочь с ведением журнала и могут обеспечить более рациональный подход. Хотя я не знаком ни с одним из них.
Я знаю, что PSFramework есть кое-что интересное, касающееся регистрации. Вы можете посмотреть и поэкспериментировать, чтобы узнать, подходят ли они вашим потребностям.
В противном случае вы можете провести исследование в PSGallery на предмет модулей регистрации (это исследование далеко от совершенства, но некоторые кандидаты могут быть интересны)
find-module *logging* | Select Name, Description, PublishedDate,Projecturi | Sort PublishedDate -Descending