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

Powershell 从具有最高值的数组返回对象,powershell,Powershell,我想从数组中返回一个属性值最高的对象。目前我正在做以下工作 Get-VM | Sort-Object -Property ProvisionedSpaceGB | Select-Object -Last 1 这是可行的,但效率很低。我不需要对整个数组进行排序,我只需要具有最大值的对象。理想情况下,我会使用类似 Get-VM | Measure-Object -Property ProvisionedSpaceGB -Maximum 但这只返回对象属性的值,而不是整个对象的值。有没有办法让测量

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

Get-VM | Sort-Object -Property ProvisionedSpaceGB | Select-Object -Last 1
这是可行的,但效率很低。我不需要对整个数组进行排序,我只需要具有最大值的对象。理想情况下,我会使用类似

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

但这只返回对象属性的值,而不是整个对象的值。有没有办法让测量对象返回基本对象?

不直接返回
Measure Object
是一种获取这些值的简单方法,而不是它们的输入对象。您可以从测量对象获得最大值,然后与数组进行比较,但这需要几个步骤:

$array = Get-VM
$max = ($array | measure-object -Property ProvisionedSpaceGB -maximum).maximum
$array | ? { $_.ProvisionedSpaceGB -eq $max}
您还可以完全放弃度量对象,并在集合中迭代,替换最大值和输出

$max = 0
$array | Foreach-Object 
{ 
    if($max -le $_.ProvisionedSpaceGB)
    { 
        $output = $_ 
        $max = $_.ProvisionedSpaceGB
    } 
}
$output
这有点脏,所以总是返回一个值。如果要在可能有多个值具有相同的最大值(例如,使用Get ChildItem时的文件大小长度)的情况下重用它,则需要进行较小的调整。如果两个或多个对象对
ProvisionedSpaceGB
具有相同的值,它将用后者迭代来替换
$output
。您可以很容易地将
$output
转换为一个集合来解决这个问题

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

您可以使用以下方法:

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

如果重新编写
$array |?{$\.ProvisionedSpaceGB-eq$max}
作为
@($array |?{$\.ProvisionedSpaceGB-eq$max})[0]
可能会为您返回单个值,但正如Hyper Anthony所指出的,并不总是您想要的值。这正是OP所做的,仅在一行中。