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()发生冲突:)