get-winevent -filterxpath против select-xml

Я пытаюсь понять xpath лучше, пытаясь то же самое в обоих select-xml и Get-WinEvent, Но, некоторые Get-WinEvent шаблоны не работают в Select-Xml, Я получил:

Выражение должно вычисляться для набора узлов

Это работает, если я поставлю "|" вместо первого "а". Я сделал XML-файл из журнала Windows. Я думаю, вы не можете "и" два пути во второй команде? Я думаю, это должно быть

*[System[EventID=4624] and EventData[Data [@Name='TargetUserName'] and Data='testuser']]

Но Get-WinEvent больше прощать.

# works ok (login event)
Get-WinEvent Security -FilterXPath "*[System[EventID=4624]] and 
  *[EventData[Data[@Name='TargetUserName'] and Data='testuser']]"

# error
# "| select -expand node" if you want the xml object
select-xml "*[System[EventID=4624]] and 
  *[EventData[Data [@Name='TargetUserName'] and Data='testuser']]" event.xml

select-xml : Expression must evaluate to a node-set.
At line:1 char:2
+ select-xml "*[System[EventID=4624]] and *[EventData[Data [@Name='Tar ...
+  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
     + CategoryInfo          : NotSpecified: (:) [Select-Xml], XPathException
     + FullyQualifiedErrorId : System.Xml.XPath.XPathException,Microsoft.PowerShell.Commands.SelectXmlCommand

Вот упрощенный файл event.xml:

<Event>
  <System>
    <EventID>4624</EventID> 
  </System>
  <EventData>
    <Data Name="TargetUserName">testuser</Data> 
  </EventData>
</Event>

1 ответ

Проблема в том, что они не одного типа XPath, Get-WinEvent использует фильтр XPath (-FilterXPath), в то время как Select-XML прямой -XPath выбор, и вы не можете использовать ни взаимозаменяемо.

Т.е. Get-WinEvent ты пишешь XPath Filter Выражение для фильтрации (удалить узлы из документа, не соответствующие запросу).

За Select-XML ты пишешь XPath выражение для выбора узлов для возврата. Когда в запросе написано, что он не может понять, как вернуть определенный узел, вы получаете сообщение об ошибке.

Выражение должно оцениваться как набор узлов.

Потому что, действительно, вы не возвращаете конкретный узел.

Почему | работал потому что | является оператором объединения (|). Это возвращение союза двух выражений. Действительно, если мы разделим выражение пополам, оба выражения будут работать самостоятельно:

PS> select-xml "*[System[EventID=4624]]" event.xml

Node  Path        Pattern
----  ----        -------
Event InputStream *[EventData[Data [@Name='TargetUserName'] and Data='testuser']]

PS> select-xml " *[EventData[Data [@Name='TargetUserName'] and Data='testuser']]" event.xml

Node  Path        Pattern
----  ----        -------
Event InputStream *[EventData[Data [@Name='TargetUserName'] and Data='testuser']]

Поскольку каждая половина выражения может быть оценена, чтобы предназначаться для определенного узла, это работает. Union просто возвращает все узлы, соответствующие любому из выражений.

Другие вопросы по тегам