2

在我的一个脚本中,我注意到当我将自定义对象存储在一个数组中时,然后,如果我修改对象属性,所有更改也会在数组中进行。

有没有一种简单的方法来按值存储对象?

我想避免每次我想存储它的值时重新创建一个新对象。

例子:

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
4

2 回答 2

4

添加到数组时,添加对象的副本:

$arr += $obj.PSObject.Copy()

http://msdn.microsoft.com/en-us/library/system.management.automation.psobject.copy(v=vs.85).aspx

于 2013-08-03T20:06:41.953 回答
0

最后,我在“克隆 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
于 2013-08-04T07:58:13.850 回答