2013-09-23 11 views
7

Ich möchte ein Objekt aus einem Array zurückgeben, dessen Eigenschaft den höchsten Wert hat. Zur Zeit mache ich folgendeRückgabeobjekt aus Array mit höchstem Wert

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

Das funktioniert aber ineffizient. Ich brauche nicht das gesamte Array sortiert, ich brauche nur das Objekt mit dem größten Wert. Idealerweise würde ich etwas wie

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

verwenden, aber dies gibt nur den Wert der Objekteigenschaft zurück, nicht das gesamte Objekt. Gibt es eine Möglichkeit, dass measure-object das Basisobjekt zurückgibt?

Antwort

9

Nicht direkt. Measure-Object soll eine einfache Möglichkeit sein, solche Werte zu erfassen, nicht ihre Eingabeobjekte. Sie konnte das Maximum aus Measure-Object erhalten und vergleichen Sie dann gegen die Anordnung, aber es dauert ein paar Schritte:

$array = Get-VM 
$max = ($array | measure-object -Property ProvisionedSpaceGB -maximum).maximum 
$array | ? { $_.ProvisionedSpaceGB -eq $max} 

Sie könnten auch Measure-Object vollständig und durchlaufen den Satz verzichten, um die maximale ersetzt und Ausgabe, wie Sie gehen.

$max = 0 
$array | Foreach-Object 
{ 
    if($max -le $_.ProvisionedSpaceGB) 
    { 
     $output = $_ 
     $max = $_.ProvisionedSpaceGB 
    } 
} 
$output 

Dies ist ein wenig schmutziger, um immer einen einzelnen Wert zurückzugeben. Es würde eine geringfügige Anpassung erfordern, wenn Sie es in einem Fall wiederverwenden, in dem mehrere Werte mit demselben Maximum vorhanden sein können (z. B. Dateigröße bei Verwendung von Get-ChildItem). Es ersetzt $output durch die letztere Iteration in einem Fall, in dem zwei oder mehr Objekte den gleichen Wert für ProvisionedSpaceGB haben. Sie könnten $output in eine Sammlung umwandeln, die leicht genug ist, um das zu beheben.

Ich bevorzuge die frühere Lösung selbst, aber ich wollte eine andere Möglichkeit bieten, über das Problem nachzudenken.

+0

Wenn Sie neu geschrieben '$ array | ? {$ _ ProvisionedSpaceGB -eq $ max.} ' als ' @ ($ array | {$ _. ProvisionedSpaceGB -eq $ max}) [0] ' die einen einzelnen Wert für Sie zurückkommen könnte, aber als Hyper Anthony bemerkte, nicht immer derjenige, den Sie wollten. –

3

Sie können diese verwenden:

$array = Get-VM | Sort-Object -Property ProvisionedSpaceGB -Descending 
$array[0] 
Verwandte Themen