我有一个相对简单的脚本来列出大约的目录。 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”一样,如果它存在的话。
答案 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')]"
}