【问题标题】:Sort powershell hashtable by date property按日期属性对 powershell 哈希表进行排序
【发布时间】: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 获取

标签: powershell sorting


【解决方案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 会更加高效和简单。
    猜你喜欢
    • 2013-08-02
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2021-08-22
    • 1970-01-01
    相关资源
    最近更新 更多