2012-03-06 109 views
12

我想創建自定義PSObject的新實例。我有一個創建爲PSObject的Button對象,我想創建一個新的對象Button2,它具有與Button相同的成員,但我找不到如何克隆原始對象而不使其在原始對象中引用(如果更改Button2中的屬性也會在Button中更改)。有沒有辦法通過一些Clone()方法來使用哈希表和數組呢?如何創建PSObject對象的新克隆實例

+0

轉到我的回答如果你想有一個函數'clone'爲您 – 2017-05-25 23:45:37

回答

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

這是奇怪的做到這一點,我沒有克隆方法availabl即看起來好像我打包物體的方式存在問題。當我使用你的例子我有克隆方法可用,但我先創建空對象,然後通過添加成員添加所有成員。所以當我使用: $ object = New-Object PSObject $ object |添加成員NoteProperty propVal「test」 powershell說[System.Management.Automation.PSCustomObject]不包含方法Close。 – 2012-03-06 10:35:38

+0

@JosefNemec我不好使用錯誤的語法來創建PsObject。你沒有克隆方法是正確的。所以要解決這個問題,你可以將所有的原始屬性複製到新的對象。 – 2012-03-06 11:17:24

+0

很好,非常感謝! – 2012-03-06 12:05:08

11

另一種可能性:

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

似乎沒有工作......我得到了兩個新的價值。嘗試調用'GetHashCode()',它們爲我指向同一個對象。 – 2012-03-06 12:02:14

+0

你說得對。測試不良。我會撤回。 – mjolinor 2012-03-06 12:10:16

+0

不同的方法。效果更好。 – mjolinor 2012-03-06 13:26:03

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的psobject的唯一答案。 – aggieNick02 2017-10-06 19:30:59

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