在 PowerShell 上查找 Hashtable 的最小元素值是 - DateTime

问题描述

一个hashtable的视图: 键(字符串) - 值(日期时间)

必须在 Values (dateTime-s) 中找到最小值。 找不到通用方法来找到这样的值。唯一的办法就是像

$first_file_date = $dates_hash.Values | Measure-Object -Minimum -Maximum
Get-Date ($first_file_date);

虽然很明显我得到了结果 ($first_file_date) 实际值转换为 GenericObjectMeasureInfo 类型,我无法将其转换回 DateTime 以进一步工作。

有什么想法吗?

解决方法

您感兴趣的值存储在 Minimum 返回的对象的 MaximumMeasure-Object 属性中:

$measurement = $dates_hash.Values | Measure-Object -Minimum -Maximum

# Minimum/oldest datetime value is stored here
$measurement.Minimum

# Maximum/newest datetime value is stored here
$measurement.Maximum

如果您希望在单个管道中使用原始值,请使用 ForEach-ObjectSelect-Object

$oldest = $dates_hash.Values | Measure-Object -Minimum | ForEach-Object -MemberName Minimum
# or 
$oldest = $dates_hash.Values | Measure-Object -Minimum | Select-Object -ExpandProperty Minimum
,

使用基于 LINQ 的替代解决方案补充 Mathias R. Jessen's helpful answer

# Sample hashtable.
$hash = @{
  foo = (Get-Date)
  bar = (Get-Date).AddDays(-1)
}

# Note that the minimum is sought among the hash's *values* ([datetime] instances)
# The [datetime[] cast is required to find the appropriate generic overload.
[Linq.Enumerable]::Min([datetime[]] $hash.Values)

不幸的是,从 PowerShell 中使用 LINQ 通常很麻烦(请参阅 this answer)。 GitHub proposal #2226 提出改进建议。

,

只需使用 Sort-Object

$dates_hash = @{
    "a" = (Get-Date).AddMinutes(4)    
    "b" = (Get-Date).AddMinutes(5)    
    "c" = (Get-Date).AddMinutes(2)    
    "d" = (Get-Date).AddMinutes(5)    
    "e" = (Get-Date).AddMinutes(1)    
    "f" = (Get-Date).AddMinutes(6)    
    "g" = (Get-Date).AddMinutes(8)    
}

$first_file_date = $dates_hash.Values | Sort-Object | Select-Object -First 1

或者如果你想要整个对象:

$first_file = $dates_hash.GetEnumerator() | Sort-Object -Property "Value" | Select-Object -First 1