You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 04:24:24