在Powershell中,如何通过“值”而不是“引用”将对象存储在数组中?

时间:2013-08-03 16:02:56

标签: arrays object powershell

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

是否有一种按值存储对象的简单方法?

我希望每次想要存储其值时都避免重新创建新对象。

示例:

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

2 个答案:

答案 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