Глубокое копирование PSObject - PullRequest
2 голосов
/ 09 февраля 2012

У меня есть сценарий 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;
    }
}

Мне нужно сделать это, потому что я хочу сделать несколько отдельных копий данных в CSV для выполнения нескольких различных манипуляций.В некотором смысле я выполняю «INNER JOIN» для результирующего массива PSObject .Я могу легко перебрать $somePSObjectHashtables с помощью ForEach-Object и вызвать Hashtable.Clone () для каждого члена массива.Затем я могу использовать New-Object PSObject -Property $someHashTable[$i] для получения глубокой копии PSObject.

Мой вопрос: есть ли какой-нибудь более простой способ сделать глубокую копию без промежуточной Hashtable?

Ответы [ 2 ]

4 голосов
/ 09 февраля 2012

Для получения действительно глубоких копий мы можем использовать двоичную сериализацию (при условии, что все данные сериализуемы; это определенно относится к данным, которые поступают из 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
0 голосов
/ 28 июня 2019

Обратите внимание, что вот более короткая, возможно, немного более чистая версия этого (которая мне очень нравится):

$data = Import-Csv .\test.csv

$serialData = [System.Management.Automation.PSSerializer]::Serialize($data)

$data2 = [System.Management.Automation.PSSerializer]::Deserialize($serialData)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...