Jus*_*ing 4 .net powershell deep-copy psobject
我有一个Powershell脚本,在其中执行以下操作
$somePSObjectHashtables = New-Object Hashtable[] $somePSObject.Length;
$somePSObjects = Import-CSV $csvPath
0..($somePSObject.Length - 1) | ForEach-Object {
$i = $_;
$somePSObjectHashtables[$i] = @{};
$somePSObject[$_].PSObject.Properties | ForEach-Object {
$somePSObjectHashtables[$i][$_.Name] = $_.Value;
}
}
Run Code Online (Sandbox Code Playgroud)
我需要这样做,因为我想在CSV中制作数据的多个不同副本以执行多个不同的操作。从某种意义上说,我正在对所得的PSObject数组执行“ INNER JOIN” 。我可以轻松地$somePSObjectHashtables使用ForEach-Object进行迭代,并在数组的每个成员上调用Hashtable.Clone()。然后,我可以New-Object PSObject -Property $someHashTable[$i]用来获取PSObject的深层副本。
我的问题是,没有中间的Hashtable,有没有更简单的方法来制作深层副本?
小智 8
请注意,这里有一个更短、可能更简洁的版本(我非常喜欢):
$data = Import-Csv .\test.csv
$serialData = [System.Management.Automation.PSSerializer]::Serialize($data)
$data2 = [System.Management.Automation.PSSerializer]::Deserialize($serialData)
Run Code Online (Sandbox Code Playgroud)
为了获得真正的深层副本,我们可以使用二进制序列化(假设所有数据都是可序列化的;对于来自CSV的数据肯定是这种情况):
# Get original data
$data = Import-Csv ...
# Serialize and Deserialize data using BinaryFormatter
$ms = New-Object System.IO.MemoryStream
$bf = New-Object System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
$bf.Serialize($ms, $data)
$ms.Position = 0
$data2 = $bf.Deserialize($ms)
$ms.Close()
# Use deep copied data
$data2
Run Code Online (Sandbox Code Playgroud)
小智 5
这是我用作函数的更短的函数:
using namespace System.Management.Automation
function Clone-Object ($InputObject) {
<#
.SYNOPSIS
Use the serializer to create an independent copy of an object, useful when using an object as a template
#>
[psserializer]::Deserialize(
[psserializer]::Serialize(
$InputObject
)
)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2241 次 |
| 最近记录: |