2013-08-03 49 views
1

在我的一個腳本中,我注意到當我將自定義對象存儲在一個數組中時,然後如果我修改對象屬性,則也會在數組中進行所有更改。在Powershell中,如何通過「value」而不是「reference」將數組中的對象存儲在數組中?

有沒有簡單的方法來存儲對象的價值?

我想避免重新創建一個新的對象,每次我想存儲它的值。

實施例:

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 
+1

的可能重複[如何創建PSObject對象的新的克隆實例(http://stackoverflow.com/questions/9581568/how-to-create-new-clone-instance-of-psobject-object ) –

+0

謝謝,我從這個主題中選擇了一個解決方案! – plunkets

回答

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 
4

當添加到陣列中,添加對象的副本:

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

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

+0

我也嘗試過「複製」,但問題是相同的:當我更新屬性時,更改是在數組中進行的。我也試過類似的東西: PS D:\ wamp \ www> $ obj2 = $ obj.PSObject.Copy()。var1 =「其他」 PS D:\ wamp \ www> $ arr + = $ obj2 PS D:\ wamp \ www> $ arr var1 ---- 其他 其他 – plunkets

+0

@plunkets - 你在評論中說的話不是很清楚,看起來不對。用適當的格式更新你的想法。 – manojlds

相關問題