按日期属性对 powershell 哈希表进行排序

Posted

技术标签:

【中文标题】按日期属性对 powershell 哈希表进行排序【英文标题】:Sort powershell hashtable by date property 【发布时间】:2022-01-21 23:34:05 【问题描述】:

我有一个包含大约 1000 个项目的哈希表,其中一个属性是日期

$ht=@
$ht[1]=@Date="11/11/2021"; Number=03321
$ht[2]=@Date="10/10/2021"; Number=03321
$ht[3]=@Date="09/10/2021"; Number=03321
# .....

等等 我需要选择 10 条日期最早的记录 - 知道我该怎么做吗? 谢谢

【问题讨论】:

我不知道你是怎么想到这种格式的,但在 PowerShell 中更常见的是有一个PSCustomObjects 的列表,也知道这通常是 cmdlet 的默认输入和输出(包括显示)。 从 SharePoint 获取 【参考方案1】:

我会将这个包含编号哈希表的 Hashtable 转换为 PsCustomObjects 数组,从而使排序和选择变得更加容易:

$ht=@
$ht[1]=@Date="11/11/2021"; Number=03321
$ht[2]=@Date="10/10/2021"; Number=03321
$ht[3]=@Date="09/10/2021"; Number=03321

# convert to array of PsCustomObjects
$ht.GetEnumerator() | ForEach-Object  [PsCustomObject]$_.Value  |
Sort-Object [datetime]::ParseExact($_.Date, 'dd/MM/yyyy', $null) |
Select-Object -First 10

这将产生一个对象数组,具有属性NumberDate,按日期排序。

【讨论】:

【参考方案2】:

以下脚本用于按日期升序。如果降序添加 -descending 在 sort-object 中,还请更改您在 select-object 中的记录数

$ht=@
$ht[1]=@Date="11/11/2021"; Number=03320
$ht[2]=@Date="10/10/2021"; Number=03321
$ht[3]=@Date="09/10/2021"; Number=03329

$ht.GetEnumerator()| Sort-Object $_.Value.Date | Select-Object -First 2 | ForEach-Object  Write-Host $_.Value.Date $_.Value.Number 

【讨论】:

这似乎可行,但如果我尝试从“foreach”创建一个新哈希: $h_fs=@ $h_free.GetEnumerator()|排序对象 $_.Value.ReleaseDate | ForEach-Object $tn=$_.Value; $n=$tn.Number; $h_fs["$n"]=@数字=$n; ReleaseDate=$tn.ReleaseDate ; Write-Host $n " - " $tn.ReleaseDate 我得到“System.Collections.DictionaryEntry”的列表,而不是可以被 $object.property 引用的普通对象? 上述代码与给定的输入不同,GetEnumerator 将列出值。从那里您可以提取值。请参考@Theo 答案,使用 PSCustomObject 会更加高效和简单。

以上是关于按日期属性对 powershell 哈希表进行排序的主要内容,如果未能解决你的问题,请参考以下文章

PowerShell对象排序(结合哈希表)

c#哈希表 怎么对value(double类型)进行排序 按顺序输出key(string类型)

Powershell 排序哈希表

以数组为值对哈希表进行排序

哈希表 - 按输入方式排序

对日期为键的哈希进行排序。 (红宝石1.8.7)