如何创建PSObject对象的新克隆实例

Jos*_*mec 22 powershell

我想创建自定义PSObject的新实例.我有一个创建为PSObject的Button对象,我想创建新的对象Button2,它具有与Button相同的成员,但我找不到如何克隆原始对象而不在原始对象中引用它的方法(如果我更改Button2中的属性也在Button中更改.有没有办法如何通过一些Clone()方法与哈希表和数组类似地做到这一点?

Woo*_*ody 63

最简单的方法是使用==> 的复制方法PsObject$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
Run Code Online (Sandbox Code Playgroud)

输出:

Fld3 : Fld3
Fld2 : Fld2
Fld1 : Fld1

Fld3 : Fld3
Fld2 : Fld2
Fld1 : Changed_Fld
Fld4 : Fld4
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这只会执行浅拷贝。 (3认同)

mjo*_*nor 14

另一种可能性

 $o1 = New-Object PsObject -Property @{ prop1='a' ; prop2='b' }
 $o2 = $o1 | select *
 $o2.prop1 = 'newvalue'
 $o1.prop1
 $o2.prop1
 a
 newvalue
Run Code Online (Sandbox Code Playgroud)


And*_*ndi 12

确实没有克隆方法!但是如果有遗嘱......

$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
Run Code Online (Sandbox Code Playgroud)

输出:

prop2     prop1                                                                 
-----     -----                                                                 
b         newvalue                                                              
b         a      
Run Code Online (Sandbox Code Playgroud)


小智 10

由于某种原因,PSObject.Copy()不适用于所有对象类型.创建对象副本的另一个解决方案是将其转换为Json或从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
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,这是唯一可以深克隆包含其他psobject的psobject的答案。 (2认同)

js2*_*010 6

这是一个带有隐藏 .psobject.copy() 的 [pscustomobject] 示例:

$a = [pscustomobject]@{message='hi'}
$a.message
hi

$b = $a.psobject.copy()
$b.message
hi

$a.message = 'there'
$a.message
there

$b.message
hi
Run Code Online (Sandbox Code Playgroud)


小智 5

我发现更好的方法是使用 ConvertTo-Json 和 ConvertFrom-Json。Ee - 假设你想克隆一个对象 $toBeClonedObject,只需运行下面的代码即可克隆。

$clonedObject = $toBeClonedObject | ConvertTo-Json | ConvertFrom-Json
Run Code Online (Sandbox Code Playgroud)