我想从数组中返回一个属性值最高的对象。目前我正在做以下
Get-VM | Sort-Object -Property ProvisionedSpaceGB | Select-Object -Last 1
这有效,但效率低下。我不需要整个数组排序,我只需要具有最大值的对象。理想情况下我会使用像
这样的东西Get-VM | Measure-Object -Property ProvisionedSpaceGB -Maximum
但这只返回object属性的值,而不是整个对象的值。有没有办法让measure-object返回基础对象?
答案 0 :(得分:10)
不直接。 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
变成一个集合来解决这个问题。
我自己更喜欢以前的解决方案,但我想提供一种不同的方式来思考这个问题。
答案 1 :(得分:6)
您可以使用:
$array = Get-VM | Sort-Object -Property ProvisionedSpaceGB -Descending
$array[0]