2012-03-06 17 views
12

私のカスタムPSObjectの新しいインスタンスを作成したいと思います。私はPSObjectとして作成されたButtonオブジェクトを持っていて、Buttonと同じメンバを持つ新しいオブジェクトButton2を作成したいのですが、元のオブジェクトで参照することなく元のオブジェクトを複製する方法を見つけることができませんButton2のプロパティもButtonで変更されます)。いくつかのClone()メソッドを使ってハッシュテーブルや配列と同様にする方法がありますか?PSObjectオブジェクトの新しいクローンインスタンスを作成する方法

+0

行く私の答えにあなたは奇妙なあなた –

答えて

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

のためにこれを行うには、関数 'clone'をしたい場合、私は、Cloneメソッドがご利用できていませんe。私はオブジェクトをクレートする方法に問題があるように見えます。あなたの例を使用すると、私はクローンメソッドを利用できますが、まず空のオブジェクトを作成してから、すべてのメンバーをAdd-Memberで追加します。だから私が使用する: $オブジェクト=新しいオブジェクトPSObject $オブジェクト| Add-Member NoteProperty propVal "test" powershellは、[System.Management.Automation.PSCustomObject]にCloseメソッドが含まれていないことを示しています。 –

+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 ==>のCopy方法を使用することです$o2 = $o1.PsObject.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 

出力:何らかの理由PSObject.Copy(のために

Fld3 : Fld3 
Fld2 : Fld2 
Fld1 : Fld1 

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

)は、すべてのオブジェクトタイプには使用できません。オブジェクトのコピーを作成するための別の解決策は、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

これはこれまでのところ、他のオブジェクトを含むオブジェクトを深くクローンする唯一の答えです。 – 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

関連する問題