首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >-filterxpath与select-xml的比较

-filterxpath与select-xml的比较
EN

Stack Overflow用户
提问于 2019-02-05 22:10:06
回答 1查看 722关注 0票数 0

我试图通过在select-xml和Get-WinEvent中尝试相同的方法来更好地理解xpath。但是一些Get-WinEvent模式在Select-Xml中似乎不起作用。我得到:

表达式必须计算为节点集。

如果我把第一个“和”写成“x”就行了。我从一个windows日志中创建了一个xml文件。我想你不能在第二个命令中“和”两条路径?我想应该是

代码语言:javascript
复制
*[System[EventID=4624] and EventData[Data [@Name='TargetUserName'] and Data='testuser']]

Get-WinEvent更宽容。

代码语言:javascript
复制
# 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:

代码语言:javascript
复制
<Event>
  <System>
    <EventID>4624</EventID> 
  </System>
  <EventData>
    <Data Name="TargetUserName">testuser</Data> 
  </EventData>
</Event>
EN

回答 1

Stack Overflow用户

发布于 2019-02-05 23:44:28

问题在于它们不是相同类型的XPathGet-WinEvent使用Filter XPath (-FilterXPath),而Select-XML是直接的-XPath选择,不能交替使用。

例如,Get-WinEvent,您编写一个XPath Filter表达式来筛选(从文档中删除不匹配查询的节点)。

对于Select-XML,您可以编写一个XPath表达式来选择要返回的节点。当编写查询时,它无法确定如何返回特定节点,则会得到错误

表达式必须计算为节点集.

因为,实际上,您没有返回特定的节点。

|之所以起作用是因为|并(?)运算符。它正在返回这两个表达式的联合。实际上,如果我们将表达式分成两部分,那么这两个表达式都是独立工作的:

代码语言:javascript
复制
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只返回匹配任何一个表达式的所有节点。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54543836

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档