【问题标题】:Return object from array with highest value从具有最高值的数组中返回对象
【发布时间】:2013-09-28 18:42:06
【问题描述】:

我想从一个数组中返回一个属性值最高的对象。目前我正在做以下事情

Get-VM | Sort-Object -Property ProvisionedSpaceGB | Select-Object -Last 1

这可行,但效率低下。我不需要对整个数组进行排序,我只需要具有最大值的对象。理想情况下,我会使用类似的东西

Get-VM | Measure-Object -Property ProvisionedSpaceGB -Maximum

但这仅返回对象属性的值,而不是整个对象。有没有办法让 measure-object 返回基础对象?

【问题讨论】:

    标签: powershell


    【解决方案1】:

    你可以用这个:

    $array = Get-VM | Sort-Object  -Property ProvisionedSpaceGB -Descending
    $array[0]
    

    【讨论】:

    • 这正是 OP 正在做的事情,只有一行。
    【解决方案2】:

    不直接。 Measure-Object 旨在成为一种获取此类值的简单方法,而不是它们的输入对象。您可以从 Measure-Object 中获取最大值,然后与数组进行比较,但这需要几个步骤:

    $array = Get-VM
    $max = ($array | measure-object -Property ProvisionedSpaceGB -maximum).maximum
    $array | ? { $_.ProvisionedSpaceGB -eq $max}
    

    您也可以完全放弃 Measure-Object 并遍历集合,随时替换最大值和输出。

    $max = 0
    $array | Foreach-Object 
    { 
        if($max -le $_.ProvisionedSpaceGB)
        { 
            $output = $_ 
            $max = $_.ProvisionedSpaceGB
        } 
    }
    $output
    

    这有点脏,所以总是返回一个值。如果要在可能有多个具有相同最大值的值(例如,使用 Get-ChildItem 时的文件大小长度)的情况下重用它,则需要进行微小的调整。如果两个或多个对象具有相同的ProvisionedSpaceGB 值,它将用后者迭代替换$output。你可以很容易地将$output 变成一个集合来解决这个问题。

    我自己更喜欢前一种解决方案,但我想提供一种不同的方式来思考这个问题。

    【讨论】:

    • 如果您将 $array | ? { $_.ProvisionedSpaceGB -eq $max} 重写为 @($array | ? { $_.ProvisionedSpaceGB -eq $max})[0],可能会为您返回一个值,但正如 Hyper Anthony 所说,并不总是您想要的。
    猜你喜欢
    • 2020-08-06
    • 2015-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-09-28
    • 1970-01-01
    • 2021-05-29
    • 2021-03-23
    • 1970-01-01
    相关资源
    最近更新 更多