如何用PowerShell获取各主机名对应最新时间戳的行?
需求说明
输入数据
| Hostnames | Status | Time |
|---|---|---|
| Host1 | Retired | 1/31/2023 9:27:06 PM |
| Host2 | Active | 2/1/2023 11:45:48 AM |
| Host1 | Active | 2/10/2023 4:59:27 AM |
| Host1 | Active | 2/13/2023 1:24:50 PM |
| Host2 | Retired | 2/10/2023 1:17:29 PM |
期望输出
| Hostnames | Status | Time |
|---|---|---|
| Host1 | Active | 2/13/2023 1:24:50 PM |
| Host2 | Retired | 2/10/2023 1:17:29 PM |
PowerShell实现方案
通过分组-排序-取首条的逻辑即可提取每个主机的最新记录,核心是将时间字段转换为可排序的DateTime类型,确保排序准确性。
代码示例
# 模拟输入数据(如果是从CSV文件读取,替换为 Import-Csv -Path "你的文件路径.csv") $inputData = @( [PSCustomObject]@{ Hostnames = 'Host1'; Status = 'Retired'; Time = '1/31/2023 9:27:06 PM' }, [PSCustomObject]@{ Hostnames = 'Host2'; Status = 'Active'; Time = '2/1/2023 11:45:48 AM' }, [PSCustomObject]@{ Hostnames = 'Host1'; Status = 'Active'; Time = '2/10/2023 4:59:27 AM' }, [PSCustomObject]@{ Hostnames = 'Host1'; Status = 'Active'; Time = '2/13/2023 1:24:50 PM' }, [PSCustomObject]@{ Hostnames = 'Host2'; Status = 'Retired'; Time = '2/10/2023 1:17:29 PM' } ) # 核心处理流程 $result = $inputData | # 按主机名分组 Group-Object -Property Hostnames | ForEach-Object { # 每组内按时间降序排序,取第一条(最新记录) $_.Group | Sort-Object { [DateTime]$_.Time } -Descending | Select-Object -First 1 } # 格式化输出结果 $result | Format-Table -AutoSize
逻辑说明
- 分组:用
Group-Object将数据按Hostnames归类,每个分组对应单台主机的所有状态记录。 - 排序:将
Time字段强制转换为DateTime类型,确保时间排序的准确性,再按降序排列(最新时间在前)。 - 取首条:用
Select-Object -First 1提取每组的第一条记录,即该主机的最新状态记录。
内容的提问来源于stack exchange,提问作者Mudit Bahedia
相关产品推荐
相关产品推荐

