Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

PowerShell copy an array completely

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.

like image 270
DarkLite1 Avatar asked Apr 17 '15 12:04

DarkLite1


1 Answers

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.
like image 149
Petru Zaharia Avatar answered Nov 15 '22 20:11

Petru Zaharia