Я пытаюсь лучше понять 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>





Проблема в том, что они не относятся к одному и тому же типу 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.