事件日志 > 筛选当前日志 > XML > 其中 EventData 包含文本

Joh*_*van 5 windows-event-log xml query eventviewer

我试图在 Windows 事件日志中搜索事件数据包含字符串TCP Provider, error: 0作为较长错误消息的一部分的任何内容。为此,我创建了以下代码:

<QueryList>
  <Query Id="0" Path="Application">
    <Select Path="Application">*[System[Provider[@Name='MyDemo' or @Name='AnotherDemo'] and (Level=2 or Level=3)]][EventData[Data[contains(.,'TCP Provider, error: 0')]]]</Select>
  </Query>
</QueryList>
Run Code Online (Sandbox Code Playgroud)

然而,这被视为无效查询 - 我猜测 contains 语句未被识别(因为它看起来像是这里使用了特殊版本的 XPath 语法。有谁知道我正在尝试的是否可行/如何去做这件事吗?

提前致谢,

柔佛州

小智 4

您始终可以使用 powershell 脚本并通过 powershell 的 where 函数传递 XML(支持 -contains -like -match):

NV.PS1

$Query = @"
  <QueryList>
    <Query Id="0" Path="System">
      <Select Path="System">
        *[System[(EventID=20001)]]
      </Select>
    </Query>
  </QueryList>
"@

$events = Get-WinEvent -FilterXml $Query
ForEach ($Event in $Events) {
    # Convert the event to XML
    $eventXML = [xml]$Event.ToXml()
    Add-Member -InputObject $Event -MemberType NoteProperty -Force -Name  DriverVersion -Value $eventXML.Event.UserData.InstallDeviceID.DriverVersion
    Add-Member -InputObject $Event -MemberType NoteProperty -Force -Name  DriverDescription -Value $eventXML.Event.UserData.InstallDeviceID.DriverDescription
    Add-Member -InputObject $Event -MemberType NoteProperty -Force -Name  Data -Value $eventXML.Event.EventData.Data
}
$Events | Select TimeCreated, Id, DriverDescription, DriverVersion, ProviderName, @{Name="MessageData";Expression={$_.Message + $_.Data}} | Where {$_.DriverDescription -match "NVIDIA GeForce GTX*"} | Out-GridView
pause
Run Code Online (Sandbox Code Playgroud)

用于启动它的 cmd (nv.cmd):

powershell.exe -executionpolicy bypass "& '.\nv.ps1'"
Run Code Online (Sandbox Code Playgroud)