代码如下所示:
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 ...”错误进入我的自定义错误变量?
答案 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)如何容纳不同的对象类型。但事实似乎就是如此。如果有人对这个问题有一个很好的解释,我肯定希望听到它。与此同时,我将把这个标记为答案。