无法过滤对象集合以仅选择具有最新日期的对象

4

我有一个对象集合,名为$items

enter image description here

我想要筛选$items,使其不包含FullName属性重复的对象,并且唯一的对象是最新的。

由于我找不到如何做到这一点,我的解决方法是首先创建一个只包含以FullName属性命名的重复项的新对象,即$duplicateItems

$arrDuplicates = @{}
$duplicateItems = foreach ($row in $restoreItems.FullName) {
  if ($arrDuplicates.ContainsKey($row) -and $arrDuplicates[$row] -lt 2) {
    $row
  }
  $arrDuplicates[$row] += 1
}

enter image description here

接下来我试着遍历$items,如果当前的$item.FullName存在于$duplicateItems中,则选择具有最新的DeletedDate对象并恢复它:

foreach ($item in $items) {
  if ($item.FullName -in $duplicateItems) {
    $filteredItem = $items | Where-Object {$_.FullName -eq $item.FullName} | Sort-Object DeletedDate | Select-Object -Last 1

    $filteredItem.Restore()
  }
  $items = items | Where-Object {$_.FullName -ne $item.FullName}
}

我认为如果使用 $items = items | Where-Object {$_.FullName -ne $item.FullName} 这部分,循环将只对唯一的对象进行 $filteredItem.Restore() 操作,而不是所有的 $items

我相信有一种更简单的方法来过滤 $items,使其不包含根据 FullName 属性重复的对象,但唯一的对象是具有最新日期的对象。


1
要遍历哈希表中的每个项目,您需要在筛选之前将.GetEnumerator()添加到其中。因此它将是$items.GetEnumerator() - Drew
2
你尝试过 $items | Sort-Object DeletedDate -Descending | Select-Object Fullname -Unique 吗? - Paxz
1
@Paxz:如果你只关心全名,那么这可以奏效,但它对于过滤原始列表是不起作用的。 - mklement0
@DrewLean:一般来说是这样的,但是在这里$items不是一个哈希表(“对象集合”-请参见第一个屏幕截图;尽管它的名称是$arrDuplicates,但它是一个哈希表)。 - mklement0
2个回答

1

我猜$items是PowerShell对象,而模糊的信息包含相同的字符串。你可以尝试:

$items | Sort-Object -Property DeletedDate,Name -Unique 

如果顺序不正确,请尝试。
$items | Sort-Object -Property DeletedDate,Name -Unique -Descending

基本上,您只需要按两个属性进行排序,然后选择唯一的值。

1
这样做不行,因为-Unique仅筛选出指定属性值全部匹配的对象,而输入中有重复的FullName(而非Name),并非由DeletedDate引起的。 - mklement0

1

分组文件按照它们的完整名称,然后从每个组中选择最新的文件:

$restoreItems | Group-Object FullName | ForEach-Object {
    $_.Group | Sort-Object DeletedDate | Select-Object -Last 1
}

这里假设时间戳是一个DateTime对象。如果实际上它是一个字符串,你需要先将其解析为DateTime对象,否则排序顺序将不正确,正如LotPings在评论中指出的那样。

2
简单标题(如示例中所示)可能出现在多个文件夹中,因此我会使用FullName进行分组,并且仅当类型为[datetime]时才可以按DeletedDate排序 - 否则它首先必须被转换/ ParseExact为[datetime]。 - user6811411
2
@LotPings 是的,我没有仔细阅读问题。感谢提醒。至于时间戳,我认为可以安全地假设它们是“DateTime”对象,但我仍然添加了一条注释。 - Ansgar Wiechers

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接