2013-07-10 34 views
1

趕上System.Diagnostics.Eventing.Reader錯誤代碼如下所示:如何在PowerShell中

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,這只是正常的時候一開始winevent cmdlet的找不到符合XML命令字符串中的條件的任何事件。但問題是:如果XML命令字符串無效,則會在$ error變量而不是$ eventerr變量中創建錯誤。我想將該錯誤存儲在我的自定義錯誤變量中,但我不知道它來自哪裏或產生了什麼。或者爲什麼它實際上還不在我的自定義變量中。當我看到這兩種不同類型的錯誤,這是輸出I得到:

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

它可能發生在PowerShell中試圖$commandString轉換爲XmlDocument(在該-FilterXml的類型參數)。我不認爲你將能夠捕獲錯誤在你的錯誤變量,因爲它被調用爲Get-WinEvent之前發生的事情。最好的辦法是設法將它傳遞給Get-WinEvent之前驗證$commandString

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 

T有人說,我注意到有時使用-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)] 
+0

您對錯誤來自哪裏的建議很有可能。我嘗試了try-catch,它沒有抓住它。也許是因爲它看起來不錯,直到get-winevent評估它?有問題的XML: <查詢ID =「0」路徑=「系統」> <選擇路徑=「系統」> * [系統[提供程序[@名稱='msiinstaller'](級別= 3或級別= 1或Level = 2) 和TimeCreated [@SystemTime > ='2013-07-09T05:00:00.000Z' 和@SystemTime < ='2013-07-10T05:00:00。000Z」]]] 你不能定義 「級別」,如果你正在使用的 「提供者」。 –

+0

對不起......我無法弄清楚如何將xml轉換爲代碼塊。 >。< –

+0

這是有效的XML。不知道爲什麼錯誤沒有被捕獲。我發現'-ErrorVariable'有時不起作用。我通常回退到'$ Error'。 : - | –

0

這兩個不同的錯誤會產生不同類型的錯誤消息。這些類型具有不同的屬性。 $ eventerr.message擁有我所需要的文本,如果錯誤是
類型名:System.Management.Automation.CmdletInvocationException
指定的查詢無效

$ eventerr.exception持有錯誤文本如果錯誤是這種類型:
類型名稱:System.Management.Automation.ErrorRecord
未找到與指定的選擇條件匹配的事件。

我不清楚單個變量(eventerr)如何能容納不同的對象類型。但是,這似乎是這種情況。如果任何人對此有何解釋,我一定會喜歡聽。同時,我將把這標記爲答案。