此範例僅適用於 Windows 平臺。
若要閱讀原始的 2014 年 6 月 3 日 Scripting Guy 部落格文章,請參閱 使用 FilterHashTable 搭配 PowerShell 篩選事件記錄檔。
本文是原始部落格文章的摘錄,並說明如何使用 Get-WinEvent
Cmdlet 的 FilterHashtable 參數來篩選事件記錄。 PowerShell 的 Get-WinEvent
Cmdlet 是篩選 Windows 事件和診斷記錄的強大方法。 當查詢使用 FilterHashtable 參數時Get-WinEvent
,效能會改善。
當您使用大型事件記錄檔時,將物件向下傳送至 Where-Object
命令並無效率。 在 PowerShell 6 之前, Get-EventLog
Cmdlet 是取得記錄數據的另一個選項。 例如,下列命令對篩選 Microsoft-Windows-Defrag 記錄沒有效率:
Get-EventLog -LogName Application | Where-Object Source -Match defrag
Get-WinEvent -LogName Application | Where-Object { $_.ProviderName -match 'defrag' }
下列命令會使用哈希表來改善效能:
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='*defrag'
}
關於列舉的部落格文章
本文提供如何在哈希表中使用列舉值的相關信息。 如需有關列舉法的更多資訊,請閱讀這些 Scripting Guy 部落格文章。 若要建立傳回列舉值的函式,請參閱 列舉和值。 如需詳細資訊,請參閱 有關列舉的 Scripting Guy 系列部落格文章。
哈希表鍵值對
若要建置有效率的 Get-WinEvent
查詢,請使用 Cmdlet 搭配 FilterHashtable 參數。
FilterHashtable 接受哈希表做為篩選條件,以從 Windows 事件記錄檔取得特定資訊。 哈希表使用 索引鍵/值 組。 如需哈希表的詳細資訊,請參閱 about_Hash_Tables。
如果 索引鍵/值 組位於同一行,則必須以分號分隔。 如果每個 鍵值 組都位於個別行上,則不需要分號。 例如,本文會將 索引鍵/值 組放在不同的行上,而且不會使用分號。
此範例會使用 FilterHashtable 參數的數個 索引鍵/值 組。 已完成的查詢包括 LogName、 ProviderName、 關鍵詞、 標識碼和 層級。
下表顯示可接受的 索引鍵/值 組,並包含在 Get-WinEventFilterHashtable 參數的檔中。
下表顯示關鍵名稱、數據類型,以及對資料值是否接受萬用字元。
鍵名稱 | 實值數據類型 | 是否接受通配符? |
---|---|---|
日誌名稱 | <String[]> |
是的 |
提供者名稱 | <String[]> |
是的 |
路徑 | <String[]> |
否 |
關鍵字 | <Long[]> |
否 |
身份證 | <Int32[]> |
否 |
等級 | <Int32[]> |
否 |
開始時間 | <DateTime> |
否 |
結束時間 | <DateTime> |
否 |
UserID | <SID> |
否 |
資料 | <String[]> |
否 |
<named-data> |
<String[]> |
否 |
鍵 <named-data>
代表具名事件資料欄位。 例如,Perflib 事件 1008 可以包含下列事件數據:
<EventData>
<Data Name="Service">BITS</Data>
<Data Name="Library">C:\Windows\System32\bitsperf.dll</Data>
<Data Name="Win32Error">2</Data>
</EventData>
您可以使用下列命令來查詢這些事件:
Get-WinEvent -FilterHashtable @{LogName='Application'; 'Service'='Bits'}
備註
PowerShell 6 已新增查詢 <named-data>
的功能。
使用哈希表建置查詢
若要驗證結果並針對問題進行疑難解答,它可協助一次建置一個 索引鍵/值 組的哈希表。 查詢會從 應用程式 記錄檔取得數據。 哈希表相當於 Get-WinEvent -LogName Application
。
若要開始,請建立 Get-WinEvent
查詢。 使用 FilterHashtable 參數中的 鍵值對,其鍵為 LogName,值為 Application。
Get-WinEvent -FilterHashtable @{
LogName='Application'
}
繼續使用 ProviderName 金鑰建置哈希表。
通常,ProviderName 是出現在 Windows 事件查看器之 [來源] 字段中的名稱。 例如, .NET Runtime
在下列螢幕快照中:
更新哈希表,並包含鍵值對,其中鍵為ProviderName,值為.NET Runtime
。
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
}
備註
對於某些事件提供者,可以藉由查看事件屬性中的 [詳細數據] 索引標籤來取得正確的 ProviderName。 例如, Source 欄位顯示 Defrag
的事件,正確的 ProviderName 為 Microsoft-Windows-Defrag
。
如果您的查詢需要從封存的事件記錄檔取得數據,請使用 Path 索引鍵。 Path 值會指定記錄檔的完整路徑。 如需詳細資訊,請參閱 Scripting Guy 部落格文章: 使用 PowerShell 剖析已儲存的事件記錄檔中的錯誤。
在哈希表中使用列舉值
關鍵詞 是哈希表中的下一個索引鍵。
Keywords 數據類型是包含大量數位之[long]
實值型別的陣列。 使用下列命令來尋找 的最大值 [long]
:
[long]::MaxValue
9223372036854775807
針對 關鍵詞 索引鍵,PowerShell 會使用數位,而不是 安全性之類的字串。 Windows 事件查看器 會將 關鍵詞 顯示為字串,但它們是列舉值。 在哈希表中,如果您使用 關鍵詞 索引鍵搭配字串值,則會顯示錯誤訊息。
開啟 Windows 事件查看器 ,然後從 [ 動作] 窗格中,按兩下 [ 篩選目前記錄檔]。 [ 關鍵詞] 下拉功能表會顯示可用的關鍵詞,如下列螢幕快照所示:
使用下列命令來顯示 StandardEventKeywords
屬性名稱。
[System.Diagnostics.Eventing.Reader.StandardEventKeywords] |
Get-Member -Static -MemberType Property
TypeName: System.Diagnostics.Eventing.Reader.StandardEventKeywords
Name MemberType Definition
—- ———- ———-
AuditFailure Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
AuditSuccess Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
CorrelationHint Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
CorrelationHint2 Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
EventLogClassic Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
None Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
ResponseTime Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
Sqm Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
WdiContext Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
WdiDiagnostic Property static System.Diagnostics.Eventing.Reader.StandardEventKey…
列舉值記載於 .NET Framework 中。 如需詳細資訊,請參閱 StandardEventKeywords 列舉。
關鍵字名稱與列舉值如下所示:
名稱 | 價值 |
---|---|
AuditFailure | 4503599627370496 |
AuditSuccess | 9007199254740992 |
CorrelationHint2 | 18014398509481984 |
EventLogClassic | 36028797018963968 |
平方米 | 2251799813685248 |
WdiDiagnostic | 1125899906842624 |
WdiContext | 562949953421312 |
ResponseTime | 281474976710656 |
沒有 | 0 |
請更新哈希表,並將包含鍵為關鍵詞的鍵值對和EventLogClassic列舉值36028797018963968添加進來。
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
}
關鍵字靜態屬性值 (選擇性)
會列舉 Keywords 索引鍵,但您可以在哈希表查詢中使用靜態屬性名稱。 屬性名稱必須轉換成具有 value__ 屬性的值,而不是使用傳回的字串。
例如,下列腳本會使用 value__ 屬性。
$C = [System.Diagnostics.Eventing.Reader.StandardEventKeywords]::EventLogClassic
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=$C.value__
}
依事件標識碼篩選
若要取得更特定的數據,查詢的結果會依 事件標識符進行篩選。哈希表中會參考 事件標識碼 做為索引鍵 標識碼 ,而值是特定的 事件標識碼。 Windows 事件查看器 會顯示 事件標識碼。此範例使用 事件標識碼 1023。
更新哈希表,並包含索引鍵 /值 組與索引鍵、 標識碼 和值 1023。
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
ID=1023
}
依層級篩選
若要進一步精簡結果,並只包含錯誤的事件,請使用 Level 索引鍵。 Windows 事件查看器 會將 [層級 ] 顯示為字串值,但會列舉這些值。 在哈希表中,如果您使用 Level 索引鍵搭配字串值,則會顯示錯誤訊息。
層級具有錯誤、警告或資訊等值。 使用下列命令來顯示 StandardEventLevel
屬性名稱。
[System.Diagnostics.Eventing.Reader.StandardEventLevel] |
Get-Member -Static -MemberType Property
TypeName: System.Diagnostics.Eventing.Reader.StandardEventLevel
Name MemberType Definition
---- ---------- ----------
Critical Property static System.Diagnostics.Eventing.Reader.StandardEventLevel Critical {get;}
Error Property static System.Diagnostics.Eventing.Reader.StandardEventLevel Error {get;}
Informational Property static System.Diagnostics.Eventing.Reader.StandardEventLevel Informational {get;}
LogAlways Property static System.Diagnostics.Eventing.Reader.StandardEventLevel LogAlways {get;}
Verbose Property static System.Diagnostics.Eventing.Reader.StandardEventLevel Verbose {get;}
Warning Property static System.Diagnostics.Eventing.Reader.StandardEventLevel Warning {get;}
列舉值記載於 .NET Framework 中。 如需詳細資訊,請參閱 StandardEventLevel 列舉。
Level 索引鍵的名稱和列舉值如下所示:
名稱 | 價值 |
---|---|
詳細資訊 | 5 |
提供資訊的 | 4 |
警告 | 3 |
錯誤 | 2 |
危急 | 1 |
LogAlways | 0 |
已完成查詢的哈希表包含索引鍵、 層級和值 2。
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
ID=1023
Level=2
}
列舉中的 Level的靜態屬性(可選)
Level 鍵被列舉,但您可以在哈希表查詢中使用靜態屬性名稱。 屬性名稱必須轉換成具有 value__ 屬性的值,而不是使用傳回的字串。
例如,下列腳本會使用 value__ 屬性。
$C = [System.Diagnostics.Eventing.Reader.StandardEventLevel]::Informational
Get-WinEvent -FilterHashtable @{
LogName='Application'
ProviderName='.NET Runtime'
Keywords=36028797018963968
ID=1023
Level=$C.value__
}