按部分名称匹配

时间:2016-06-03 14:45:28

标签: powershell

我有一个网络共享,格式为

的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循环的一部分,以便不必循环两次。

1 个答案:

答案 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
}