2013-09-23 3 views
7

के साथ सरणी से वापसी वस्तु मैं एक ऐसे सरणी से वापस लौटना चाहता हूं जिसके पास संपत्ति का उच्चतम मूल्य है। वर्तमान में मैं निम्नलिखितउच्चतम मूल्य

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

यह काम करता है लेकिन अक्षम है। मुझे पूरे सरणी को क्रमबद्ध करने की ज़रूरत नहीं है, मुझे बस सबसे बड़ी कीमत के साथ वस्तु की आवश्यकता है। आदर्श रूप में मैं जैसे

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

कुछ प्रयोग करेंगे लेकिन यह केवल वस्तु संपत्ति, नहीं संपूर्ण वस्तु का मान देता है। क्या माप-ऑब्जेक्ट बेस ऑब्जेक्ट को वापस करने का कोई तरीका है?

उत्तर

9

सीधे नहीं। Measure-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 

यह एक छोटा सा गंदगी है ताकि हमेशा एक ही मूल्य वापस कर सके। यदि आप इसे एक ऐसे मामले में पुन: उपयोग करना चाहते हैं, तो इसे एक मामूली समायोजन की आवश्यकता होगी जहां अधिकतम मूल्य हो सकते हैं (उदाहरण के लिए गेट-चाइल्डआईटम का उपयोग करते समय फाइलसाइज लम्बाई)। यह $output को बाद वाले पुनरावृत्त के साथ प्रतिस्थापित करेगा जहां दो या दो से अधिक ऑब्जेक्ट्स ProvisionedSpaceGB के लिए समान मान रखते हैं। आप इसे ठीक करने के लिए आसानी से पर्याप्त संग्रह में $output को बदल सकते हैं।

मैं अपने पूर्व समाधान को प्राथमिकता देता हूं, लेकिन मैं समस्या के बारे में सोचने के लिए एक अलग तरीका प्रदान करना चाहता था।

+0

आप फिर से लिखा है, तो '$ सरणी | ? {$ _ ProvisionedSpaceGB -eq $ अधिकतम।} ' रूप ' @ ($ सरणी |? {। $ _ ProvisionedSpaceGB -eq $ max}) [0] ' है कि आप के लिए एक ही मान सकता है, लेकिन के रूप में हाइपर एंथनी ने नोट किया, हमेशा वह नहीं होना चाहिए जिसे आप चाहते थे। –

3

आप इस का उपयोग कर सकते हैं:

$array = Get-VM | Sort-Object -Property ProvisionedSpaceGB -Descending 
$array[0] 
संबंधित मुद्दे