Powershell – Piping powershell messages to Write-EventLog

loggingpowershellwindows-event-log

I have a powershell script that runs a custom cmdlet. It is run by Task Scheduler and I want to log what it does.

This is my current crude version:

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

What I would like to do is log the output of my custom cmdlet. Ideally I'd like to create different types of event log entries based on whether it was a warning or a verbose message.

Update: I don't want to log the return value of the commandlet. The Update-ClubMembers cmdlet does not return an object. I want to log any verbose messages written by WriteVerbose and I want to log errors created by ThrowTerminatingError.

Best Answer

What kind of data does the cmdlet return? You could save it into a string like so,

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

If the data returned is an array, you must create an ordinary string first. Othervise, the log message will just contain the array name. Maybe something like this

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

Ed:

As far as I know - and I'd really like to be wrong in this one - you have run into a nasty limitation of Powershell. Keith Hill's blog has kind of a work-around. You mentioned that the cmdlet is a custom one. Maybe you could ask its developer to add a switcht that toggles the messages to stdout, so that executing the cmdlet would return its output as an easily logged string array.