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

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

expression must evaluate to a node-set

Это работает, если я поставлю "|" вместо первого «и». Я сделал 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>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
552
1

Ответы 1

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

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

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

Expression must evaluate to a node-set.

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

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

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 просто возвращает все узлы, соответствующие любому из выражений.

Я не знаю. И два пути, такие как «* и *», просто кажутся каким-то расширением Microsoft или ошибкой. Я не вижу его больше нигде. Вы будете чаще видеть это в XML-фильтрах журнала Windows.

js2010 06.02.2019 15:11

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