需要根据XML属性过滤XML文件并列出LastWriteTime

时间:2017-01-10 13:36:55

标签: xml powershell xpath

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

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

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

PS> gci $path 

Mode                LastWriteTime     Length Name
----                -------------     ------
-a---          1/9/2017  12:39 PM       6643 File.xml

然后使用XPath检索节点值:

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

Node        Path                    Pattern
----        ----                    -------
Order       \\<Path>\file.xml       //Order[contains(@OrderDate,'2017-01-10')]

但我需要将这两个脚本组合在一起,这样我才能获得只包含所需节点值的文件列表,同时还显示LastWriteTime。它似乎不想在Select LastWriteTime的同一行中添加Select-Xml。就好像我使用“Where-Xml”一样,如果它存在的话。

1 个答案:

答案 0 :(得分: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
}

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

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