Проблема в том, что они не одного типа XPath
.Get-WinEvent
использует Filter XPath (-FilterXPath
), в то время как Select-XML
является прямым -XPath
выбором, и вы не можете использовать оба взаимозаменяемо.
Т.е. Get-WinEvent
youзаписать выражение 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 просто возвращает все узлы, соответствующие любому из выражений.