1

代码如下所示:

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...”错误放入我的自定义错误变量中?

4

2 回答 2

0

当 PowerShell 尝试转换$commandStringXmlDocument-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)]
于 2013-07-10T03:24:40.810 回答
0

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

如果错误属于以下类型,则 $eventerr.exception 保存错误文本:
TypeName: System.Management.Automation.ErrorRecord
未找到符合指定选择条件的事件。

我不清楚单个变量(eventerr)如何保存不同的对象类型。但这似乎是事实。如果有人对这是怎么回事有一个很好的解释,我肯定想听听。同时,我将把它标记为答案。

于 2013-07-11T00:09:01.573 回答