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所做的,仅在一行中。