I'm trying to create a complete copy of an existing array. Every time I try this it doesn't seem to work. The thing is that I'm modifying the Object names inside the new copied array, but they're also changed in the original array..
The code below is highly simplified as there is a lot more happening then only renaming object names but it proves the point I think.
Some example code:
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
The desired result is 2 completely separate arrays.
$FruitsOriginal
Type
----
Banana
Apple
Pear
$FruitsNew
Tasty fruits
------------
Banana
Apple
Pear
Thank you for your help.
Since Powershell 3.0, same approach as Jaco's answer but using PSSerializer.
It uses a CliXML
format compatible with Export-Clixml
& Import-Clixml
and personally I find it easier to read.
In theory, supports a nested hierarchy up to [int32]::MaxValue
levels-deep
# 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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With