我有一个运行自定义 cmdlet 的 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
我想要做的是记录自定义 cmdlet 的输出。理想情况下,我希望根据它是警告还是详细信息来创建不同类型的事件日志条目。
更新:我不想记录命令行的返回值。Update-ClubMembers cmdlet 不返回对象。我想记录 WriteVerbose 写入的任何详细消息,我想记录 ThrowTerminatingError 创建的错误。
答案1
该 cmdlet 返回什么类型的数据?您可以将其保存为字符串,如下所示:
$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。Keith Hill 的博客有点像解决方法。您提到该 cmdlet 是自定义的。也许您可以要求其开发人员添加一个 switcht,将消息切换到 stdout,这样执行该 cmdlet 就会将其输出返回为易于记录的字符串数组。
答案2
正如 vonPryz 指出的那样,似乎没有办法从 cmdlet 捕获详细消息,但是 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
}