2012-03-06 12 views
12

के नए क्लोन उदाहरण बनाने के लिए मैं अपने कस्टम PSObject का नया उदाहरण बनाना चाहते हैं। मेरे पास पीएसओब्जेक्ट के रूप में बनाई गई एक बटन ऑब्जेक्ट है और मैं नया ऑब्जेक्ट बटन 2 बनाना चाहता हूं जिसमें बटन के समान सदस्य हैं, लेकिन मुझे मूल ऑब्जेक्ट में संदर्भित किए बिना मूल ऑब्जेक्ट को क्लोन करने का कोई तरीका नहीं मिल रहा है (यदि मैं बदलता हूं बटन 2 में एक संपत्ति बटन में भी बदलती है)। क्या कुछ क्लोन() विधि के माध्यम से हैशटेबल्स और सरणी के समान ही ऐसा करने का कोई तरीका है?कैसे PSObject वस्तु

+0

जाओ यदि आप एक समारोह चाहते 'clone' आप –

उत्तर

9

दरअसल कोई क्लोन विधि है! हालांकि जहां एक वसीयत नहीं है ...

$o = New-Object PsObject -Property @{ prop1='a' ; prop2='b' } 
$o2 = New-Object PsObject 
$o.psobject.properties | % { 
    $o2 | Add-Member -MemberType $_.MemberType -Name $_.Name -Value $_.Value 
} 
$o.prop1 = 'newvalue' 

$o 
$o2 

आउटपुट:

prop2  prop1                 
-----  -----                 
b   newvalue                
b   a  
+0

कि अजीब है के लिए यह करने के लिए, मैं क्लोन विधि उपलब्ध नही की जरूरत नहीं है ई। ऐसा लगता है कि जिस तरह से मैं वस्तु को क्रेट करता हूं उसमें कोई समस्या है। जब मैं आपके उदाहरण का उपयोग करता हूं तो मेरे पास क्लोन विधि उपलब्ध है, लेकिन मैं पहले खाली वस्तु बना देता हूं और फिर सभी सदस्यों को एड-सदस्य के माध्यम से जोड़ता हूं। तो जब मैं उपयोग करता हूं: $ ऑब्जेक्ट = नया ऑब्जेक्ट PSObject $ ऑब्जेक्ट | ऐड-सदस्य NoteProperty propVal "परीक्षण" powershell का कहना है [System.Management.Automation.PSCustomObject] कि विधि बंद शामिल नहीं है। –

+0

@JosefNemec मेरा बुरा मैंने PsObject बनाने के लिए गलत वाक्यविन्यास का उपयोग किया। आप सही हैं कि कोई क्लोन विधि नहीं है। तो इसके आसपास काम करने के लिए आप बस सभी मूल गुणों को नई वस्तु में कॉपी कर सकते हैं। –

+0

बहुत अच्छा काम करता है, बहुत बहुत धन्यवाद! –

11

एक और संभावना:

$o1 = New-Object PsObject -Property @{ prop1='a' ; prop2='b' } 
$o2 = $o1 | select * 
$o2.prop1 = 'newvalue' 
$o1.prop1 
$o2.prop1 
a 
newvalue 
+0

काम नहीं लग रहा है ... मुझे दोनों के लिए नया मूल्य मिला है। 'GetHashCode()' को कॉल करने का प्रयास करें, वे मेरे लिए एक ही वस्तु को इंगित कर रहे हैं। –

+0

आप सही हैं। खराब परीक्षण मैं इसे वापस ले जाऊंगा। – mjolinor

+0

विभिन्न विधि। बेहतर काम करता है। – mjolinor

45

सबसे आसान तरीका एक PsObject ==>$o2 = $o1.PsObject.Copy() की Copy विधि का उपयोग करने के लिए है

$o1 = New-Object -TypeName PsObject -Property @{ 
    Fld1 = 'Fld1'; 
    Fld2 = 'Fld2'; 
    Fld3 = 'Fld3'} 

$o2 = $o1.PsObject.Copy() 

$o2 | Add-Member -MemberType NoteProperty -Name Fld4 -Value 'Fld4' 
$o2.Fld1 = 'Changed_Fld' 

$o1 | Format-List 
$o2 | Format-List 

आउटपुट:

Fld3 : Fld3 
Fld2 : Fld2 
Fld1 : Fld1 

Fld3 : Fld3 
Fld2 : Fld2 
Fld1 : Changed_Fld 
Fld4 : Fld4 
3

किसी कारण PSObject.Copy के लिए() सभी वस्तु प्रकार के लिए काम नहीं करता। एक वस्तु की प्रतिलिपि बनाने के लिए एक अन्य समाधान यह करने के लिए/तो कन्वर्ट करने के लिए Json से एक नया वेरिएबल में सहेज है: अपने वर्तमान खंड में

$CustomObject1 = [pscustomobject]@{a=1; b=2; c=3; d=4} 
$CustomObject2 = $CustomObject1 | ConvertTo-Json -depth 100 | ConvertFrom-Json 
$CustomObject2 | add-Member -Name "e" -Value "5" -MemberType noteproperty 

$CustomObject1 | Format-List 
$CustomObject2 | Format-List 
+0

यह अब तक का एकमात्र उत्तर है जो गहरा क्लोन एक psobject होगा जिसमें अन्य psobjects शामिल हैं। – aggieNick02

0

एक उपयोगिता कक्षा में इस रखो या इसे परिभाषित

function clone($obj) 
{ 
    $newobj = New-Object PsObject 
    $obj.psobject.Properties | % {Add-Member -MemberType NoteProperty -InputObject $newobj -Name $_.Name -Value $_.Value} 
    return $newobj 
} 

उपयोग:

$clonedobj = clone $obj

मेरे जवाब देने के लिए
संबंधित मुद्दे