none
Import-CSVをしたオブジェクトのコピーについて RRS feed

  • 質問

  • お世話になります。
    CSVデータを取得して、そのデータを別のデータとしてコピーしたいのですが
    参照渡しとなってしまい、コピー元も変更されてしまいます。

    -csvデータ(objectTest.csv)-
    Name,Color
    Taro,White
    Jiro,Black
    Hana,Brown

    $CurrentDir = Split-Path $MyInvocation.MyCommand.Path
    $csvData=$CurrentDir+"\objectTest.csv"
    
    $a = Import-Csv $csvData
    $b = $a.psobject.Copy()
    
    $b[0].Color="White and Black"
    
    write-host "結果"
    $a | Out-Host # $aの中身も変更されてしまう
    $b | Out-Host

    理想は以下のようにしたいです。
    Name,Color
    ------ -------
    Taro,White
    Jiro,Black
    Hana,Brown

    Name,Color
    ------ -------
    Taro,White and Black
    Jiro,Black
    Hana,Brown

    もう一度csvを読み込む以外で何かコピーする方法はないでしょうか?
    また、PSCusutomObjectの場合はpsobject.Copy()でコピーができる差はなんなのでしょうか?

    どうぞよろしくお願いいたします。

    2020年3月25日 4:34

回答

  • これでどうでしょう。

    $b = [System.Management.Automation.PSSerializer]::Deserialize([System.Management.Automation.PSSerializer]::Serialize($a))

    • 回答としてマーク ccc_rlr 2020年3月26日 0:41
    2020年3月25日 4:59

すべての返信

  • これでどうでしょう。

    $b = [System.Management.Automation.PSSerializer]::Deserialize([System.Management.Automation.PSSerializer]::Serialize($a))

    • 回答としてマーク ccc_rlr 2020年3月26日 0:41
    2020年3月25日 4:59
  • 魔界の仮面弁士さんの回答に類似して

    $b =  $a | ConvertTo-Json -depth 100 | ConvertFrom-Json

    とか、何かしら別形式に変換して復元する必要があります。で、そこまでするなら

    $a = Import-Csv $csvData
    $b = Import-Csv $csvData

    でいいんじゃないかしら?


    • 編集済み 佐祐理 2020年3月25日 5:12
    2020年3月25日 5:12
  • ご回答いただきありがとうございます。

    シンプルな結論で助かりました。

    2020年3月26日 0:42