我试图通过在select-xml和Get-WinEvent
中尝试相同的方法来更好地理解xpath。但是某些Get-WinEvent
模式在Select-Xml
中似乎不起作用。我得到:
表达式必须计算为节点集
如果我输入“ |”就可以了而不是第一个“和”。我从Windows日志中制作了一个xml文件。我猜您不能在第二个命令中“和”两个路径?我想应该是
*[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>
答案 0 :(得分:0)
问题是因为它们与XPath
类型不同。 Get-WinEvent
使用 Filter XPath(-FilterXPath
),而Select-XML
是直接的-XPath
选择,您不能互换使用。>
即Get-WinEvent
编写了一个XPath Filter
表达式以进行过滤(从文档中删除与查询不匹配的节点)。
对于Select-XML
,您将一个XPath
表达式写入 Select 节点以返回。当编写查询无法解决如何返回特定节点的查询时,就会出现错误
表达式必须计算为节点集。
因为,实际上,您没有返回特定的节点。
|
之所以起作用是因为|
是Union (|) Operator。它正在返回两个表达式的并集。确实,如果我们将表达式分成两半,则两个表达式都可以独立工作:
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']]
因为可以对表达式的每一半进行评估以使其针对特定节点,所以它可以工作。联合只返回与任一表达式匹配的所有节点。