【发布时间】: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