PowerShell去重:按唯一ID保留最新StartTime的PS Object
解决PowerShell中按唯一ID保留最新StartTime对象的问题
完全懂你的痛点!Sort-Object -Property ID -Unique确实不靠谱,它只会保留每组ID的第一个出现的对象,根本不会考虑StartTime的新旧。你的思路是对的,得结合分组、排序和取首项来实现,具体步骤如下:
核心实现代码
# 先按ID分组,再对每组按StartTime降序排序,最后取每组的第一个对象 $UniqueList = $CompleteList | Group-Object -Property ID | ForEach-Object { $_.Group | Sort-Object -Property StartTime -Descending | Select-Object -First 1 }
代码逐行解释
Group-Object -Property ID:把所有对象按ID分组,每个分组里包含同一个ID的所有对象ForEach-Object:遍历每个分组$_.Group | Sort-Object -Property StartTime -Descending:对当前分组里的对象按StartTime从新到旧排序(降序)Select-Object -First 1:取排序后的第一个对象,也就是该ID下StartTime最新的那条
测试示例(可直接运行验证)
# 模拟测试数据 $CompleteList = @( [PSCustomObject]@{Status='Active'; ID='1001'; StartTime='2024-01-01 09:00:00'} [PSCustomObject]@{Status='Inactive'; ID='1001'; StartTime='2024-05-15 14:30:00'} [PSCustomObject]@{Status='Active'; ID='1002'; StartTime='2024-03-20 10:15:00'} [PSCustomObject]@{Status='Active'; ID='1002'; StartTime='2024-06-01 08:45:00'} ) # 执行核心逻辑 $UniqueList = $CompleteList | Group-Object -Property ID | ForEach-Object { $_.Group | Sort-Object -Property StartTime -Descending | Select-Object -First 1 } # 输出结果 $UniqueList
运行后会得到每个ID的最新StartTime对象:
Status ID StartTime ------ -- --------- Inactive 1001 2024-05-15 14:30:00 Active 1002 2024-06-01 08:45:00
额外提示
如果你的StartTime是字符串类型,确保它是标准的ISO格式(比如yyyy-MM-dd HH:mm:ss),这样排序才会准确。如果是DateTime类型,那就更没问题了,排序逻辑完全适用。
内容的提问来源于stack exchange,提问作者R_S
相关产品推荐
相关产品推荐

