我有一个运行自定义cmdlet的PowerShell脚本。 它由Task Scheduler运行,我想logging它做什么。
这是我目前的粗略版本:
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
我想要做的是logging我的自定义cmdlet的输出。 理想情况下,我想创build不同types的事件日志条目,根据是警告还是详细消息。
更新:我不想loggingcommandlet的返回值。 Update-ClubMembers cmdlet不返回对象。 我想logging任何由WriteVerbose写的详细消息,我想logging由ThrowTerminatingError创build的错误。
cmdlet返回什么样的数据? 你可以像这样把它保存成一个string,
$ret = Get-ClubMembers -Whatever... Write-EventLog -LogName "Windows Powershell" -Source "Powershell" -Message $ret -EventId 0
如果返回的数据是数组,则必须先创build一个普通string。 另外,日志消息将只包含数组名称。 也许这样的事情
$ret = Get-ClubMembers -Whatever... Write-EventLog -LogName "Windows Powershell" -Source "Powershell" -Message $($ret -join [Environment]::NewLine) -EventId 0
艾德:
据我所知 – 我真的很想在这个错误 – 你已经遇到了Powershell的一个讨厌的 限制 。 Keith Hill的博客有一种解决方法 。 您提到该cmdlet是自定义的。 也许你可以要求开发者添加一个switcht来将消息切换到stdout,这样执行cmdlet将会以一个简单的loggingstring数组的forms返回它的输出。
正如vonPryz所指出的那样,似乎没有办法从cmdlet中获取详细的消息,但是ThrowTerminatingError会引发一个exception,并且我发现你可以捕获这些exception并logging错误,如下所示:
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 }