2017-06-23 15 views
2

私が書いているコードのサンプルに問題があります。これはちょっとした問題ですが、時間がかかりましたが問題はありません。私はすでにstackoverflow関連の質問と検索を試みたが、多くの手助けをするものは見つけられなかった。Powershell 3オブジェクトのクローンに予期しない結果がある - 他のオブジェクトに影響する

私は、次のコードを持っている:私は_私は(私はしたくない)私は以前に割り当てられた空の文字列を取得します$を使用することにより、$出力の値をプリントアウトしようとすると

#Importing some file from a csv to a variable 
$output = import-csv -LiteralPath ...some file imports OK 

## 
#Copy the layout of the csv imported for further processing.. 
## 
$extraOut = $output.clone() 
$extraOut | ForEach-Object { 
$_.innerlinks1 = "" 
$_.innerlinksurl1 = "" 
} 

を。なぜこれが起こるのですか?

#Trying to print out $output should have data and not empty strings. 
$output | ForEach-Object { Write-Host $_ } 

インポートCSV結果の構造をコピーすることを可能にする任意のヘルプ、またはコード(またはPSObjectクローニングせず)も最適であろう。

注:役立つ回答を見つけた後、今後さらに問題が発生する可能性のある空の文字列がファイル内にたくさんあるので、この問題には詳細なスクリプトが必要だと思います。

+2

アレイのクローンメソッドは、*浅いコピーを実行しますが、要素を複製しません。適切な(深い)クローニングの例を探してください、たくさんあります。 – wOxxOm

+0

'.PSObject.copy()'を使ってみましたが、同じ結果が得られました。私はすでにそれに向かっています。 – Hskdopi

+0

@ MathiasR.Jessen私はForEach-Objectでそれを試しましたが、期待通りに動作しませんでした。はい、これはオブジェクトの1つのレベルの配列です: '@ {name =; name2 =} @ {name =; name2 =}等。 – Hskdopi

答えて

1

アレイをディープコピーする必要があるときはいつでも、私はthis linkの答えを使用します。

# 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

私はこれが一時的なものに最も近い答えだと思います。既に見つかっています。 – Hskdopi

+0

もう少し検索した後、この[リンク](https://stackoverflow.com/questions/7468707/deep-copy-a-dictionary-hashtable-in-powershell)と[GitHubを要点として](https://gist.github.com/zippy1981/2006846) – Hskdopi

関連する問題