【问题标题】:Need to filter XML files based on XML attribute AND list the LastWriteTime需要根据 XML 属性过滤 XML 文件并列出 LastWriteTime
【发布时间】:2017-01-11 17:15:52
【问题描述】:

我有这个相对简单的脚本来列出大约。 2000 个 XML 文件,我希望将列表限制为具有称为 Order 的特定属性节点的列表,其值为 '2017-01-10'

虽然我可以做到这一点,但我还需要匹配文件的LastWriteTime

所以这是返回文件时的结果(将结果限制为一个):

PS> gci $path

模式 LastWriteTime 长度 名称
---- ------------- ------
-a--- 2017 年 1 月 9 日下午 12:39 6643 文件.xml

然后使用 XPath 检索节点值:

PS> gci $path | Select-Xml -XPath "//Order[contains(@OrderDate,'2017-01-10')]"

节点路径模式
---- ---- --------
Order \\\file.xml //Order[contains(@OrderDate,'2017-01-10')]

但是我需要将两个脚本结合起来,这样我的文件列表就只有所需的节点值,而且还显示了LastWriteTime。它似乎不喜欢在与Select-Xml 相同的行中添加Select LastWriteTime。几乎就好像我在使用“Where-Xml”(如果存在)。

【问题讨论】:

  • 请发布您的代码。届时我们将继续努力。
  • 你能用calculated propertyLastWriteTime 连接到另一个select 吗?
  • 代码与发布的完全相同。我希望返回与第一个脚本看起来相同的结果,除了这已过滤掉 OrderDate 与指定日期不匹配的所有其他文件。
  • 我不确定你的意思,BenH - 我只得到节点、路径和模式 - 我怎样才能从中获取 LastWriteTime 属性?

标签: xml powershell xpath


【解决方案1】:

如果您想将上游对象的特定属性添加到Select-Xml 的输出,您可以使用calculated property 来执行此操作,如下所示:

Get-ChildItem $path | ForEach-Object {
  $file = $_
  Select-Xml -Path $file.FullName -XPath "//Order[contains(@OrderDate,'2017-01-10')]" |
    Select-Object -Property *,@{n='LastWriteTime';e={$file.LastWriteTime}}
}

或者您可以创建一个仅包含您需要的属性的自定义对象:

Get-ChildItem $path | ForEach-Object {
  $node = Select-Xml -Path $_.FullName -XPath "//Order[contains(@OrderDate,'2017-01-10')]"

  $prop = [ordered]@{
    FullName      = $_.FullName
    LastWriteTime = $_.LastWriteTime
    Node          = $node.Node
  }
  New-Object -Type PSObject -Property $prop
}

或者(如果你真的想要文件列表,而不是节点列表作为输出,只是通过文件的特定内容过滤)你可以在 Where-Object 过滤器中运行 Select-Xml

Get-ChildItem $path | Where-Object {
  Select-Xml -Path $_.FullName -XPath "//Order[contains(@OrderDate,'2017-01-10')]"
}

【讨论】:

  • 太棒了——这对我很有用——谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 2013-10-07
  • 2014-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多