2013-09-23 49 views
7

Tôi muốn trả về một đối tượng từ mảng có thuộc tính có giá trị cao nhất. Hiện tại tôi đang làm như sauTrả về đối tượng từ mảng có giá trị cao nhất

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

Điều này hoạt động nhưng không hiệu quả. Tôi không cần toàn bộ mảng được sắp xếp, tôi chỉ cần đối tượng có giá trị lớn nhất. Lý tưởng nhất là tôi sẽ sử dụng một cái gì đó như

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

nhưng điều này chỉ trả về giá trị của thuộc tính đối tượng, không phải toàn bộ đối tượng. Có cách nào để có đối tượng đo lường trả về đối tượng cơ sở không?

Trả lời

9

Không trực tiếp. Measure-Object được dự định là một cách dễ dàng để lấy các giá trị như vậy, không phải là các đối tượng đầu vào của chúng. Bạn thể nhận được tối đa từ Measure-Object và sau đó so sánh với mảng, nhưng phải mất một vài bước sau:

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

Bạn cũng có thể bỏ Đo-Object hoàn toàn và lặp thông qua các thiết lập, thay thế tối đa và đầu ra khi bạn đi.

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

Điều này hơi bẩn để luôn trả về một giá trị duy nhất. Nó sẽ cần một điều chỉnh nhỏ nếu bạn sử dụng lại nó trong trường hợp có thể có nhiều giá trị có cùng một giá trị (ví dụ: chiều dài tập tin khi sử dụng Get-ChildItem). Nó sẽ thay thế $output bằng cách lặp lại sau trong trường hợp hai hoặc nhiều đối tượng có cùng giá trị cho ProvisionedSpaceGB. Bạn có thể biến $output thành một bộ sưu tập đủ dễ dàng để khắc phục điều đó.

Tôi thích giải pháp cũ hơn, nhưng tôi muốn đưa ra một cách khác để suy nghĩ về vấn đề.

+0

Nếu bạn lại viết '$ mảng | ? {$ _. ProvisionedSpaceGB -eq $ max} ' là ' @ ($ array |? {$ _. ProvisionedSpaceGB -eq $ max}) [0] ' có thể trả về một giá trị duy nhất cho bạn, nhưng Hyper Anthony lưu ý, không phải lúc nào cũng là thứ bạn muốn. –

3

Bạn có thể sử dụng này:

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