2013-09-23 18 views
7

最高の値を持つプロパティの配列からオブジェクトを返したい。現在、次のことを行っています。最高の値を持つ配列からオブジェクトを返す

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

これは機能しますが、非効率的です。私は配列全体をソートする必要はありません、私はちょうど最大の値を持つオブジェクトが必要です。理想的には、

などを使用しますが、これはオブジェクト全体の値ではなく、オブジェクトプロパティの値を返します。 measure-objectにベースオブジェクトを返す方法はありますか?

答えて

9

直接ではありません。 Measure-Objectは、入力オブジェクトではなく、そのような値を簡単に取得するためのものです。あなた測定-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 

これは、常に1つの値を返すように少し汚れています。同じ最大値(たとえば、Get-ChildItemを使用する場合のファイルサイズの長さ)が複数ある場合に、再利用する場合は、マイナーな調整が必要です。 2つ以上のオブジェクトがProvisionedSpaceGBの同じ値を持つ場合、後者の反復で$outputを置き換えます。 $outputを簡単に修正してコレクションにすることができます。

私は前者のソリューションを自分で好むが、私はその問題について考える方法を変えたいと思っていた。

+0

あなたは '$配列を書いた再場合| ? {0} ' ' @($ array |?{$ _} ProvisionedSpaceGB -eq $ max})[0] ' あなたのために単一の値を返すかもしれないが、 Hyper Anthonyは、必ずしもあなたが望むものではないと述べました。 –

3

あなたはこれを使用することができます:

$array = Get-VM | Sort-Object -Property ProvisionedSpaceGB -Descending 
$array[0] 
関連する問題