从具有最高值的数组返回对象

piz*_*m13 8 powershell

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

Get-VM | Sort-Object -Property ProvisionedSpaceGB | Select-Object -Last 1
Run Code Online (Sandbox Code Playgroud)

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

Get-VM | Measure-Object -Property ProvisionedSpaceGB -Maximum
Run Code Online (Sandbox Code Playgroud)

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

Ant*_*ace 10

不是直接的. Measure-Object旨在获取这些值的简单方法,而不是它们的输入对象.您可以从Measure-Object获得最大值,然后与阵列进行比较,但需要几个步骤:

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

您也可以完全放弃Measure-Object并迭代整个集合,随时替换最大值和输出.

$max = 0
$array | Foreach-Object 
{ 
    if($max -le $_.ProvisionedSpaceGB)
    { 
        $output = $_ 
        $max = $_.ProvisionedSpaceGB
    } 
}
$output
Run Code Online (Sandbox Code Playgroud)

这有点脏,以便始终返回单个值.如果要在可能存在多个具有相同最大值的值(例如,使用Get-ChildItem时的文件大小长度)中重复使用它,则需要进行微调.$output在两个或多个对象具有相同值的情况下,它将替换后一个迭代ProvisionedSpaceGB.你可以$output很容易地变成一个集合来修复它.

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


Alv*_*ira 7

你可以用这个:

$array = Get-VM | Sort-Object  -Property ProvisionedSpaceGB -Descending
$array[0]
Run Code Online (Sandbox Code Playgroud)

  • 这正是OP正在做的事情,只是一行。 (3认同)