2013-09-23 6 views
7

Voglio restituire un oggetto da un array la cui proprietà ha il valore più alto. Attualmente sto facendo il seguenteRestituisce l'oggetto dall'array con il valore più elevato

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

Questo funziona ma è inefficiente. Non ho bisogno di ordinare l'intero array, ho solo bisogno dell'oggetto con il maggior valore. Idealmente vorrei usare qualcosa come

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

ma questo restituisce solo il valore della proprietà dell'oggetto, non l'intero oggetto. C'è un modo per avere oggetto-misura restituire l'oggetto base?

risposta

9

Non direttamente. Measure-Object è pensato per essere un modo semplice per afferrare tali valori, non i loro oggetti di input. Si potrebbe ottenere il massimo da Measure-Object e quindi confrontare contro la matrice, ma richiede pochi passi:

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

Si potrebbe anche rinunciare Measure-Object interamente e scorrere il set, sostituendo il massimo e uscita come si va.

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

Questo è un po 'più sporco in modo da restituire sempre un singolo valore. Potrebbe essere necessario un aggiustamento minore se si dovesse riutilizzarlo in un caso in cui potrebbero esserci più valori con lo stesso valore massimo (lunghezze di file quando si utilizza Get-ChildItem, ad esempio). Sostituisce $output con quest'ultima itera in un caso in cui due o più oggetti hanno lo stesso valore per ProvisionedSpaceGB. È possibile convertire $output in una raccolta abbastanza facilmente da risolvere il problema.

Preferisco la soluzione precedente, ma volevo offrire un modo diverso di pensare al problema.

+0

Se si ri-scritto '$ array | ? {$ _ ProvisionedSpaceGB -eq $ max.} ' come ' @ ($ array |? {. $ _ ProvisionedSpaceGB -eq $ max}) [0] ' che potrebbe restituire un singolo valore per voi, ma come Hyper Anthony ha notato, non è sempre quello che volevi. –

3

È possibile utilizzare questo:

$array = Get-VM | Sort-Object -Property ProvisionedSpaceGB -Descending 
$array[0] 
Problemi correlati