Назад | Перейти на главную страницу

Передача сообщений PowerShell в Write-EventLog

У меня есть сценарий PowerShell, который запускает собственный командлет. Он запускается планировщиком задач, и я хочу регистрировать его действия.

Это моя текущая грубая версия:

Add-PsSnapIn MyCmdlets
Write-EventLog -LogName "Windows Powershell" -Source "Powershell" -Message "Starting Update-ClubNumbers" -EventId 0
Get-ClubMembers -HasTemporaryNumber -show all | Update-ClubNumbers -Verbose
Write-EventLog -LogName "Windows Powershell" -Source "Powershell" -Message "Finished Update-ClubNumbers" -EventId 0

Что я хочу сделать, так это записать вывод моего настраиваемого командлета. В идеале я хотел бы создавать разные типы записей журнала событий в зависимости от того, было ли это предупреждение или подробное сообщение.

Обновить: Я не хочу регистрировать возвращаемое значение командлета. Командлет Update-ClubMembers не возвращает объект. Я хочу регистрировать любые подробные сообщения, написанные WriteVerbose, и я хочу регистрировать ошибки, созданные ThrowTerminatingError.

Какие данные возвращает командлет? Вы можете сохранить это в строке, например,

$ret = Get-ClubMembers -Whatever...
Write-EventLog -LogName "Windows Powershell" -Source "Powershell" -Message $ret -EventId 0

Если возвращаемые данные являются массивом, сначала необходимо создать обычную строку. В противном случае сообщение журнала будет содержать только имя массива. Может что-то вроде этого

$ret = Get-ClubMembers -Whatever...
Write-EventLog -LogName "Windows Powershell" -Source "Powershell" -Message $($ret -join [Environment]::NewLine) -EventId 0

Эд:

Насколько я знаю - и я бы очень хотел ошибиться в этом - вы столкнулись с противный ограничение из Powershell. В блоге Кейта Хилла есть обходной путь. Вы упомянули, что это специальный командлет. Возможно, вы могли бы попросить его разработчика добавить переключатель, который переключает сообщения на стандартный вывод, чтобы выполнение командлета возвращало его вывод в виде легко регистрируемого массива строк.

Как указано vonPryz, похоже, нет способа перехватывать подробные сообщения из командлета, однако ThrowTerminatingError генерирует исключение, и я обнаружил, что вы можете захватить их и зарегистрировать ошибку следующим образом:

try
{
    Get-ClubMembers -HasTemporaryEbuNumber -show all | Update-EbuNumbers
}
catch [System.Exception]
{
    Write-EventLog -LogName "Windows Powershell" -Source "Powershell" -Message $_.Exception.ToString() -EventId 0 -EntryType Error
}