【问题标题】:Unable to filter collection of objects to select only those with latest date无法过滤对象集合以仅选择具有最新日期的对象
【发布时间】:2018-12-27 12:13:54
【问题描述】:

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

我想根据FullName 属性过滤$items 以不包含重复项,但让唯一对象是具有最新日期的对象。

由于我不知道该怎么做,我的解决方法是首先创建一个新对象,该对象仅包含 FullNameproperty 形式的重复项,名为 $duplicateItems

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

然后我尝试循环遍历$items,如果$duplicateItems中存在当前$item.FullName,则选择具有最新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

我确信有一种更简单的解决方案可以根据 FullName 属性过滤 $items 以不包含重复项,但让唯一对象是具有最新日期的对象。

【问题讨论】:

  • 要遍历哈希表中的每个项目,您需要在过滤之前将.GetEnumerator() 扔到它上面。所以应该是$items.GetEnumerator()
  • 你试过$items | Sort-Object DeletedDate -Descending | Select-Object Fullname -Unique吗?
  • @Paxz:如果您只对全名感兴趣,这很有效,但它不适用于过滤原始列表。
  • @DrewLean:一般来说是这样,但$items 不是这里的哈希表(“对象的集合” - 请参见第一个屏幕截图;它是 $arrDuplicates 是一个哈希表,尽管它的名字)。

标签: powershell loops object foreach filter


【解决方案1】:

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

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

如果顺序不对,试试

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

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

【讨论】:

  • 这行不通,因为-Unique 只会剔除 all 的指定属性值匹配的对象,而输入具有重复的 FullName (不是Name),不是DeletedDate
【解决方案2】:

Group 文件的全名,然后从每个组中选择最新的文件:

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

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

【讨论】:

  • 示例中的简单标题可能出现在多个文件夹中,因此我会使用 FullName 进行分组,并且仅在类型为 [datetime] 时对DeletedDate 进行排序 - 否则它会首先必须将 / ParseExact 转换为 [datetime]
  • @LotPings 是的,我没有仔细阅读这个问题。感谢您的提醒。至于时间戳,我认为假设它们是DateTime 对象是非常安全的,但无论如何我都添加了注释。
猜你喜欢
  • 2016-05-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2013-01-17
  • 2020-09-08
  • 2020-03-01
相关资源
最近更新 更多