我正在尝试创建现有数组的完整副本.每次我尝试这个似乎都不起作用.问题是我正在修改新复制数组中的Object名称,但它们也在原始数组中进行了更改.
下面的代码是高度简化的,因为有更多的事情发生,然后只重命名对象名称,但它证明了我认为的重点.
一些示例代码:
Function Get-Fruits {
Param (
$Fruits = @('Banana', 'Apple', 'Pear')
)
foreach ($F in $Fruits) {
[PSCustomObject]@{
Type = $F
}
}
}
$FruitsOriginal = Get-Fruits
Function Rename-ObjectName {
# Copy the array here
$FruitsNew = $FruitsOriginal # Not a true copy
$FruitsNew = $FruitsOriginal | % {$_} # Not a true copy
$FruitsNew = $FruitsOriginal.Clone() # Not a true copy
$FruitsNew | Get-Member | ? MemberType -EQ NoteProperty | % {
$Name = $_.Name
$FruitsNew | % {
$_ | Add-Member 'Tasty fruits' -NotePropertyValue $_.$Name
$_.PSObject.Properties.Remove($Name)
}
}
}
Rename-ObjectName
Run Code Online (Sandbox Code Playgroud)
期望的结果是2个完全独立的阵列.
$ FruitsOriginal
Type
----
Banana
Apple
Pear
Run Code Online (Sandbox Code Playgroud)
$ FruitsNew
Tasty fruits
------------
Banana
Apple
Pear
Run Code Online (Sandbox Code Playgroud)
谢谢您的帮助.
Ale*_*lex 10
您可以使用序列化来深度克隆阵列:
#Original data
$FruitsOriginal = Get-Fruits
# Serialize and Deserialize data using BinaryFormatter
$ms = New-Object System.IO.MemoryStream
$bf = New-Object System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
$bf.Serialize($ms, $FruitsOriginal)
$ms.Position = 0
#Deep copied data
$FruitsNew = $bf.Deserialize($ms)
$ms.Close()
Run Code Online (Sandbox Code Playgroud)
小智 6
# Copy the array here
$FruitsCopy = @()
$FruitsCopy = $FruitsCopy + $FruitsOriginal
Run Code Online (Sandbox Code Playgroud)
从 Powershell 3.0 开始,方法与Jaco 的答案相同,但使用 PSSerializer。
它使用CliXML与Export-Clixml&兼容的格式,Import-Clixml我个人觉得它更容易阅读。
理论上,支持嵌套层次结构到[int32]::MaxValue级别-深
# Original data
$FruitsOriginal = Get-Fruits
# Serialize and Deserialize data using PSSerializer:
$_TempCliXMLString = [System.Management.Automation.PSSerializer]::Serialize($FruitsOriginal, [int32]::MaxValue)
$FruitsNew = [System.Management.Automation.PSSerializer]::Deserialize($_TempCliXMLString)
# Deep copy done.
Run Code Online (Sandbox Code Playgroud)