2012-03-06 111 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