2013-09-23 5 views
7

Я хочу вернуть объект из массива, у которого свойство имеет наибольшее значение. В настоящее время я делаю следующиеВозвращаемый объект из массива с наибольшим значением

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

Это работает, но неэффективно. Мне не нужен весь отсортированный массив, мне просто нужен объект с наибольшим значением. В идеале я бы использовал что-то вроде

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

но это возвращает значение свойства объекта, а не всего объекта. Есть ли способ вернуть объект измерения объекту базы?

ответ

9

Не напрямую. Measure-Object - это простой способ захватить такие значения, а не их входные объекты. Вы могли получить максимум от Measure-Object, а затем сравнить с массивом, но это занимает несколько шагов:

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

Вы также можете отказаться от Measure-Object целиком и перебирать набор, заменив максимума и как вы идете.

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

Это немного грязнее, чтобы всегда возвращать единственное значение. Это потребует незначительной корректировки, если вы должны повторно использовать его в случае, когда могут быть несколько значений, имеющих один и тот же максимум (например, размер файлов при использовании Get-ChildItem). Он заменит $output последней итерацией в случае, когда два или более объекта имеют одинаковое значение для ProvisionedSpaceGB. Вы можете превратить $output в коллекцию достаточно легко, чтобы это исправить.

Я предпочитаю бывшее решение самостоятельно, но я хотел предложить другой способ подумать о проблеме.

+0

Если вы переписали '$ массива | ? {$ _ ProvisionedSpaceGB -eq $ макс.} ' , как ' @ ($ массив |? {. $ _ ProvisionedSpaceGB -eq $ макс}) [0] ' , которые могут возвращать одно значение для вас, но, как Гипер Энтони отметил, что не всегда будет тот, который вы хотели. –

3

Вы можете использовать это:

$array = Get-VM | Sort-Object -Property ProvisionedSpaceGB -Descending 
$array[0] 
Смежные вопросы