2013-09-23 72 views
7

我想返回屬性值最高的數組中的對象。目前我正在做以下操作從具有最高值的數組中返回對象

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

這樣做效果很好,但效率不高。我不需要整個數組排序,我只需要具有最大值的對象。理想情況下,我會使用類似

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

但這隻返回對象屬性的值,而不是整個對象。有沒有辦法讓度量對象返回基礎對象?

回答

9

不是直接。 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變成一個集合來解決這個問題。

我更喜歡前面的解決方案,但我想提供一種不同的方式來思考問題。

+0

如果你重新寫 '$陣列| ? {$ _。ProvisionedSpaceGB -eq $ max}' as '@($ array |?{$ _。ProvisionedSpaceGB -eq $ max})[0]' 可能會爲您返回單個值,但作爲超安東尼指出,並不總是你想要的。 –

3

您可以使用此:

$array = Get-VM | Sort-Object -Property ProvisionedSpaceGB -Descending 
$array[0] 
相關問題