Arrays PowerShell完全复制阵列

Arrays PowerShell完全复制阵列,arrays,powershell,Arrays,Powershell,我正在尝试创建现有阵列的完整副本。每次我尝试这个似乎都不起作用。问题是,我正在修改新复制数组中的对象名称,但它们在原始数组中也发生了更改 下面的代码是高度简化的,因为除了重命名对象名之外还有很多事情发生,但我认为这证明了这一点 一些示例代码: Function Get-Fruits { Param ( $Fruits = @('Banana', 'Apple', 'Pear') ) foreach ($F in $Fruits) { [PS

我正在尝试创建现有阵列的完整副本。每次我尝试这个似乎都不起作用。问题是,我正在修改新复制数组中的对象名称,但它们在原始数组中也发生了更改

下面的代码是高度简化的,因为除了重命名对象名之外还有很多事情发生,但我认为这证明了这一点

一些示例代码:

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
理想的结果是两个完全独立的阵列

$FROUTSORIGINAL

Type
----
Banana
Apple
Pear
$FROUTSNEW

Tasty fruits
------------
Banana
Apple
Pear

感谢您的帮助。

您可以使用序列化来深度克隆阵列:

#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()

根据您需要对对象执行的操作,并且如果对象足够简单(如示例中所示),您可以使用新对象替换它们


$NewFruits=$fruitsororiginal |%{[PSCustomObject]@{“Tasty Fruits”=$\.Type}

自Powershell 3.0以来,方法与使用相同。
# Copy the array here
$FruitsCopy = @()
$FruitsCopy = $FruitsCopy + $FruitsOriginal
它使用了一种与
Export-CliXML
Import-CliXML
兼容的
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.

如果要复制包含所有“truthy”值的对象/值数组,或者要快速过滤空值和“false”值,那么这非常有用:

$FruitsNew = $FruitsOriginal|?{$_}

太棒了!非常感谢Jaco:)这种方法有物体“深度”限制吗?另外,值得注意的是,只有当$FROUTSORIGINAL.GetType().IsSerializable-eq$true抱歉,还有一件事:如果$FROUTSORIGINAL包含嵌套对象,那么每个嵌套对象的.GetType().IsSerializable也必须是$true才能工作。嘿,DarkLite。。。你上一次有一个美味的新鲜同伴是什么时候?“字符串是最重要的东西”,在我的例子中,来自脚本编写人员和水果使演示代码变得更容易,哈哈。但是如果说实话,我更喜欢香蕉。希望你当选,我投你的票:)你可能会把我和其他人搞混,因为我没有参加竞选(或者我是吗?)。我还试图指出,peer被拼写错了,总是那么严重;)修好了,谢谢!你是对的,因为你错了。无论如何,我总是感谢你的帮助,所以我要特别感谢你2 u。这是一个很好的提示!谢谢你加入,不客气。在遇到这个解决方案之前,我不止一次地与$\ psobject.Copy()发生冲突:)