在我的一个脚本中,我注意到当我将自定义对象存储在一个数组中时,如果我修改了对象属性,那么所有更改也会在数组中进行。
是否有一种按值存储对象的简单方法?
我希望每次想要存储其值时都避免重新创建新对象。
示例:
PS D:\wamp\www> $obj = New-Module -ScriptBlock { $var1="value1"; Export-ModuleMember -Variable * } -AsCustomObject
PS D:\wamp\www> $arr = @()
PS D:\wamp\www> $arr += $obj
PS D:\wamp\www> $arr
var1
----
value1
PS D:\wamp\www> $obj.var1 = "newvalue"
PS D:\wamp\www> $arr += $obj
PS D:\wamp\www> $arr
var1
----
newvalue
newvalue
PS D:\wamp\www> $obj2 = $obj.Psobject.Copy()
PS D:\wamp\www> $obj2.var1 = "other"
PS D:\wamp\www> $arr += $obj2
PS D:\wamp\www> $arr
var1
----
other
other
答案 0 :(得分:4)
添加到数组时,添加对象的副本:
$arr += $obj.PSObject.Copy()
http://msdn.microsoft.com/en-us/library/system.management.automation.psobject.copy(v=vs.85).aspx
答案 1 :(得分:0)
最后,我在“clone psobject”主题中选择一个(非常简单的)解决方案:在向数组添加值时使用select *
。它也会创建一个“自定义对象”,但与“psobject.copy”方法不同,它不会创建“指针”。
PS D:\wamp\www> $m = New-Module -AsCustomObject -ScriptBlock { $var = "val"; Export-ModuleMember -Variable * }
PS D:\wamp\www> $arr += @()
PS D:\wamp\www> $arr += $m | Select *
PS D:\wamp\www> $m.var = "other"
PS D:\wamp\www> $arr += $m | Select *
PS D:\wamp\www> $arr
var
---
val
other