14

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

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

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

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

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

4

2 回答 2

16

不是直接的。 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 时的文件大小长度)的情况下重用它,则需要进行微小的调整。$output在两个或多个对象具有相同值的情况下,它将替换为后者迭代ProvisionedSpaceGB。你可以$output很容易地变成一个集合来解决这个问题。

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

于 2013-09-23T19:08:40.440 回答
10

你可以使用这个:

$array = Get-VM | Sort-Object  -Property ProvisionedSpaceGB -Descending
$array[0]
于 2016-10-19T16:08:55.770 回答