我有一个网络共享,格式为
的20.000个XML文件username-computername.xml
以(当用户收到新的计算机时)
的形式存在重复的条目 USER1-computer1.xml
user1-computer2.xml
或
BLRPPR-SKB52084.xml
BLRSIA-SKB50871.xml
S028DS-SKB51334.xml
s028ds-SKB52424.xml
S02FL6-SKB51644.xml
S02FL6-SKB52197.xml
S02VUD-SKB52083.xml
由于我以后要操作XML,我不能只解除数组的属性,因为至少我需要完整的路径。目的是,如果找到重复,则使用具有较新时间戳的副本。
这是我需要逻辑的代码片段
$xmlfiles = Get-ChildItem "network share"
我只是在进行foreach
循环:
foreach ($xmlfile in $xmlfiles) {
[xml]$xmlcontent = Get-Content -Path $xmlfile.FullName -Encoding UTF8
Select-Xml -Xml $xmlcontent -Xpath " "
# create [pscustomobject] etc...
}
基本上我需要的是
if ($xmlfiles.Name.Split("-")[0]) - duplicate) {
# select the one with higher $xmlfiles.LastWriteTime and store either
# the full object or the $xmlfiles.FullName
}
理想情况下,它应该是foreach
循环的一部分,以便不必循环两次。
答案 0 :(得分:2)
您可以使用Group-Object
按自定义属性对文件进行分组:
$xmlfiles | Group-Object { $_.Name.Split('-')[0] }
上述陈述将产生如下结果:
Count Name Group ----- ---- ----- 1 BLRPPR {BLRPPR-SKB52084.xml} 1 BLRSIA {BLRSIA-SKB50871.xml} 2 S028DS {S028DS-SKB51334.xml, s028ds-SKB52424.xml} 2 S02FL6 {S02FL6-SKB51644.xml, S02FL6-SKB52197.xml} 1 S02VUD {S02VUD-SKB52083.xml}
Group
属性包含原始FileInfo
个对象。
在ForEach-Object
循环中展开论坛,按LastWriteTime
对每个论坛进行排序,然后从中选择最新的文件:
... | ForEach-Object {
$_.Group | Sort-Object LastWriteTime -Desc | Select-Object -First 1
}