如何在powershell中捕获System.Diagnostics.Eventing.Reader错误

时间:2013-07-10 02:15:25

标签: powershell error-handling custom-error-handling

代码如下所示:

foreach ($machine in $lbx_workstations.SelectedItems)
      {
      $temp = (get-winevent -computername $machine -FilterXML $commandString -ErrorAction SilentlyContinue -ErrorVariable eventerr|
         Select MachineName, TimeCreated, LevelDisplayName, ID, ProviderName, Message) 
blah blah blah...

我创建了一个自定义错误变量$ eventerr,当get-winevent cmdlet找不到与XML命令字符串中的条件匹配的任何事件时,它可以正常工作。但问题是:如果XML命令字符串无效,则会在$ error变量而不是$ eventerr变量中创建错误。我想把这个错误存储在我的自定义错误变量中,但我不知道它来自何处或是什么产生它。或者为什么它实际上不在我的自定义变量中。当我看到这两种不同类型的错误时,这就是我得到的输出:

PS C:\Temp> $error[0].fullyqualifiederrorid
System.Diagnostics.Eventing.Reader.EventLogException,Microsoft.PowerShell.Commands.GetWinEventCommand

PS C:\Temp> $error[1].fullyqualifiederrorid
NoMatchingEventsFound,Microsoft.PowerShell.Commands.GetWinEventCommand 

我可以在自定义变量中捕获“NoMatchingEventsFound”错误,但不能捕获System.Diagnostics.Eventing ...错误。

有没有办法让“System.Diagnostics.Eventing ...”错误进入我的自定义错误变量?

2 个答案:

答案 0 :(得分:0)

当PowerShell尝试将$commandString转换为XmlDocument-FilterXml参数的类型)时,可能会发生这种情况。我不认为您能够捕获错误变量中的错误,因为它在调用Get-WinEvent之前发生。最好的办法是在尝试将$commandString传递给Get-WinEvent之前验证try { $xmlDoc = New-Object 'Xml.XmlDocument' $xmlDoc.LoadXml( $commandString ) } catch { # Or do some other kind of error handling. You're the driver! Write-Error ('Oh no! Bad XML! What are you thinking?!') } $lbx_workstationg.SelectedItems | ForEach-Object { Get-WinEvent -ComputerName $_ -FilterXml $commandString -ErrorAction SilentlyContinue -ErrorAction eventerr } | Select-Object MachineName, TimeCreated, LevelDisplayName, ID, ProviderName, Message

-ErrorVariable

话虽如此,我注意到有时使用$Error并不会导致所有错误都被放入指定的错误变量中。我从来没有发现原因。我通常最终会回到使用$errorCount = $Error.Count $lbx_workstationg.SelectedItems | ForEach-Object { Get-WinEvent -ComputerName $_ -FilterXml $commandString -ErrorAction SilentlyContinue } | Select-Object MachineName, TimeCreated, LevelDisplayName, ID, ProviderName, Message $winEventError = $Error[0..($Error.Count - $errorCount)] 。您可以通过正确的索引来获取特定于您的命令的错误:

{{1}}

答案 1 :(得分:0)

两种不同的错误会产生不同类型的错误消息。这些类型具有不同的属性。 如果错误是
,$ eventerr.message保存我需要的文本 TypeName:System.Management.Automation.CmdletInvocationException
指定的查询无效

如果错误是这种类型,$ eventerr.exception会保留错误文本:
TypeName:System.Management.Automation.ErrorRecord
未找到符合指定选择标准的事件。

我不清楚单个变量(eventerr)如何容纳不同的对象类型。但事实似乎就是如此。如果有人对这个问题有一个很好的解释,我肯定希望听到它。与此同时,我将把这个标记为答案。