2012-12-23 11 views
17

के बीच अंतर कोई भी विवरण समझा सकता है? अगर मैं एक वस्तुPSObject, हैशटेबल और PSCustomObject

$var = [PSObject]@{a=1;b=2;c=3} 

का उपयोग कर बना सकते हैं और फिर मैं अपने प्रकार getType() प्रयोग करने के लिए लग रही है Powershell मुझसे कहता प्रकार Hashtable की अपनी। ऑब्जेक्ट का निरीक्षण करने के लिए जीएम का उपयोग करते समय यह स्पष्ट है कि हैशटेबल बनाया गया है, क्योंकि इसमें कुंजी और मूल्य गुण हैं। तो "सामान्य" हैशटेबल में क्या अंतर है?

इसके अलावा, PSCustomObject का उपयोग करने का क्या फायदा है? जब ऐसा

$var = [PSCustomObject]@{a=1;b=2;c=3} 

की तरह कुछ का उपयोग कर एक बनाने मेरे लिए केवल अंतर दिखाई PSCustomObject के विभिन्न डेटाप्रकार है। कुंजी और मूल्य गुणों के बजाय, gm के साथ एक निरीक्षण से पता चलता है कि अब प्रत्येक कुंजी को नोटप्रॉपर्टी ऑब्जेक्ट के रूप में जोड़ा गया है। लेकिन मेरे पास क्या फायदे हैं? मैं हैशटेबल की तरह, इसकी चाबियों का उपयोग कर अपने मूल्यों तक पहुंचने में सक्षम हूं। मैं PSCustomObject में बस इतना आसान कुंजी-मूल्य जोड़े (उदाहरण के लिए कुंजी-ऑब्जेक्ट जोड़े) स्टोर कर सकता हूं, बस हैशटेबल में। तो क्या फायदा है? क्या कोई महत्वपूर्ण अंतर है?

उत्तर

1

मुझे लगता है कि आप जो सबसे बड़ा अंतर देखेंगे वह प्रदर्शन है। इस ब्लॉग पोस्ट पर एक नज़र डालें:

http://powertoe.wordpress.com/2011/03/31/combining-objects-efficiently-use-a-hash-table-to-index-a-collection-of-objects/

यहाँ अन्य, अधिक-सूक्ष्म लाभ में से कुछ हैं: http://blogs.microsoft.co.il/blogs/scriptfanatic/archive/2012/04/13/Custom-objects-default-display-in-PowerShell-3-0.aspx

+1

खैर , प्रदर्शन - ठीक है। लेकिन क्या वह सब कुछ है? इसके अलावा प्रदर्शन समर्थक हैशटेबल है। तो PSCustomObject के लिए अस्तित्व का अधिकार क्या है? और डिफ़ॉल्ट प्रदर्शन विकल्प, वास्तव में? आम हम डेटा से निपट रहे हैं - कोई भी उस सामान को हर दिन प्रदर्शित नहीं करना चाहता। और अब और फिर, जब मुझे कुछ डेटा प्रदर्शित करने की ज़रूरत है, तो भी मैं एक छोटा पाश बना सकता हूं और मानक स्वरूपण का उपयोग कर सकता हूं। मेरे लिए एक नया डेटाटाइप उचित ठहराने के लिए पर्याप्त प्रतीत नहीं होता है। – masi

+2

पहले लिंक में आलेख psbustom बनाम pscustomobject की गति के बारे में कुछ भी नहीं कहता है। इसके बजाय यह ओ (एम * एन) और ओ (एम * एलएन एन) एल्गोरिदम के बीच के अंतर को हाइलाइट करता है। – JJJ

+4

"लक्ष्य साइट पहुंचने योग्य या स्थायी रूप से ऑफलाइन होने पर, हमेशा एक महत्वपूर्ण लिंक के सबसे प्रासंगिक भाग को उद्धृत करें।" - http://stackoverflow.com/help/how-to-answer – Pete

10

एक लाभ यह मैं psobject के लिए लगता है कि यह है कि आप इसके साथ कस्टम तरीकों बना सकते हैं। उदाहरण

$o=New-Object PSObject -Property @{ 
    "value"=9 
} 
Add-Member -MemberType ScriptMethod -Name "Sqrt" -Value { 
    echo "the square root of $($this.value) is $([Math]::Round([Math]::Sqrt($this.value),2))" 
} -inputObject $o 

$o.Sqrt() 

आप psobject संपत्तियों की छँटाई आदेश नियंत्रित करने के लिए इसका उपयोग कर सकते के लिए (PSObject sorting देखें)

+0

ध्यान दें कि आप इसे PSObject या PSCustomObject दोनों के साथ कर सकते हैं। –

20

एक परिदृश्य में जहाँ [PSCustomObject]HashTable के बजाय प्रयोग किया जाता है जब आप उन्हें का एक संग्रह की जरूरत है।

Name Value 
---- ----- 
Name Object 1 
Squared 1 
Index 1 
Name Object 2 
Squared 4 
Index 2 
Name Object 3 
Squared 9 
... 

और $CustomObject के लिए निम्नलिखित:

Name  Index Squared 
----  ----- ------- 
Object 1  1  1 
Object 2  2  4 
Object 3  3  9 
Object 4  4  16 
Object 5  5  25 
... 

ही

$Hash = 1..10 | %{ @{Name="Object $_" ; Index=$_ ; Squared = $_*$_} } 
$Custom = 1..10 | %{[PSCustomObject] @{Name="Object $_" ; Index=$_ ; Squared = $_*$_} } 

$Hash | Format-Table -AutoSize 
$Custom | Format-Table -AutoSize 

$Hash | Export-Csv .\Hash.csv -NoTypeInformation 
$Custom | Export-Csv .\CustomObject.csv -NoTypeInformation 

Format-Table$Hash के लिए निम्नलिखित में परिणाम होगा: निम्नलिखित कि वे किस तरह से नियंत्रित किया जाता में अंतर को वर्णन करने के लिए है Export-Csv के साथ बात होती है, इस प्रकार [PSCustomObject] का उपयोग केवल सादेके बजाय करने का कारण है

13

कहें कि मैं एक फ़ोल्डर बनाना चाहता हूं।अगर मैं एक PSObject का उपयोग आप इसे द्वारा गलत है बता में यह

PS > [PSObject] @{Path='foo'; Type='directory'} 

Name       Value 
----       ----- 
Path       foo 
Type       directory 

देख सकते हैं हालांकि PSCustomObject सही लगती है

PS > [PSCustomObject] @{Path='foo'; Type='directory'} 

Path         Type 
----         ---- 
foo          directory 

मैं यह कर सकते हैं तो पाइप वस्तु

[PSCustomObject] @{Path='foo'; Type='directory'} | New-Item 
+0

वोटिंग ऊपर क्योंकि यह वही जवाब था जिसे मैं ढूंढ रहा था। –

संबंधित मुद्दे