Как гарантировать, что командлет ведения журнала вызывается для каждого исключения в модуле сценария PowerShell? - PullRequest
0 голосов
/ 14 июля 2020

В модуле сценария PowerShell (5.1 и новее) я хочу убедиться, что каждое генерируемое исключение сценария и системы вызывает командлет ведения журнала (например, Write-Log). Я знаю, что могу обернуть весь код в командлетах модуля в блоки try / catch, но я предпочитаю использовать trap для всех исключений, возникающих при выполнении командлетов модуля

trap { Write-Log -Level Critical -ErrorRecord $_ }

Использование приведенного выше оператора работает как задумано, если я добавляю его к каждому командлету внутри модуля, но я хотел бы иметь только один оператор trap, который улавливает все исключения, создаваемые командлетами модуля, чтобы не реплицировать код, а также гарантировать, что Я не пропускаю утверждение ни в одном командлете. Возможно ли это?

1 Ответ

1 голос
/ 14 июля 2020

Я бы сделал вот что.

  • Установите несколько 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

...