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.
What kind of data does the cmdlet return? You could save it into a string like so,
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
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.
As pointed out by vonPryz there does seem to be no way of capturing verbose messages from a cmdlet, however ThrowTerminatingError throws an exception and I've found that you can capture those and log the error like this: