2017-02-08 2 views
0

さまざまなソースからデータを収集するレポートファイルを作成しようとしています。 は、私はこのような報告体制を構築しています:Powershell Select-Object -expandproperty入力が配列で配列のプロパティが含まれているときに異常な動作が発生する

$Data = import-csv "some CSV FILE" 
<# 
csv file must look like this 
hostname,IP 
server1,192.168.1.20 
#> 

は、その後、私は「初期値」が事前に入力配列オブジェクトを構築しています、と私は私の$データ変数に添付した

$Ids = ('7.1.1.1','7.1.1.2') 
$CheckObj= @() 
foreach ($id in $IDs) { 
    $row = "" | Select-Object CheckID,CheckData,CheckDataRaw 
    $row.CheckID = $id 
    $row.CheckData = "NotChecked" 
    $CheckObj+= $row 
    } 


$Data = $Data | Select *,CheckData 

$data | % {$_.CheckData = $CheckObj} 

オブジェクトは、次のとおりです。私はこれをしたいまで

hostname : server1 
ip  : 192.168.1.20 
CheckData : {@{CheckID=7.1.1.1; CheckData=NotChecked; CheckDataRaw=}, 
      @{CheckID=7.1.1.2; CheckData=NotChecked; CheckDataRaw=}} 

すべてが順調です:

$としてaswell

$data | fl 


hostname : server1 
ip  : 192.168.1.1 
CheckData : {@{CheckID=7.1.1.1; CheckData=NotChecked; CheckDataRaw=; 
      hostname=server1; ip=192.168.1.1}, @{CheckID=7.1.1.2; 
      CheckData=NotChecked; CheckDataRaw=; hostname=server1; 
      ip=192.168.1.1}} 

: 私はのは、私は無視することができます言わせて、すべてのこれらのエラーを取得

...

Select-Object : The property cannot be processed because the property 
"CheckData" already exists. 
At line:1 char:24 
+ ... lReport = $data | Select-Object -Property * -ExpandProperty Checkdata 
+      ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (@{hostname=serv...ystem.Objec 
    t[]}:PSObject) [Select-Object], PSArgumentException 
    + FullyQualifiedErrorId : AlreadyExistingUserSpecifiedPropertyExpand,Micro 
    soft.PowerShell.Commands.SelectObjectCommand 

しかし、他の変数のセット全体は次のように、変更されますCheckObj変数

$CheckObj 


CheckID  : 7.1.1.1 
CheckData : NotChecked 
CheckDataRaw : 
hostname  : server1 
ip   : 192.168.1.1 

CheckID  : 7.1.1.2 
CheckData : NotChecked 
CheckDataRaw : 
hostname  : server1 
ip   : 192.168.1.1 

これは... 誰かが何かを明確にすることができ、私の側に完全に意図しないです私は間違っている?私はすべてのテストはpowershell_iseを使用して行った、と私は

私の予想結果が含まれるように$最終報告書の変数のためになるPowerShellのデフォルトを変更していないWindows 7の 上のPowerShell 5.0を使用しています

展開された内容ではなく、私がこのプロセスで使用したすべての変数...

+0

私は問題はあなたがコレクションを格納するためCHECKDATAを使用しているという事実から来ていると思います$ data変数(おそらくcsvファイルの列名として)に格納され、同時に文字列変数として使用されます。 'NotChecked')をCheckData変数に格納されたオブジェクトに追加します。コード$ row.CheckDataを$ row.CheckStatusのように変更すると良いでしょう。 –

+0

こんにちは、csvデータは、2行、ホスト名とIPしか持っていません。また、私は自分のデータ変数に別のプロパティ名を与えようとしました:$ Data = $ Data | *、CheckData2を選択し、他の変数名を同一にします。上記と同じように動作します。 – IonutN

+0

名前を変更した後$ Data = $ Data | Select *、CheckData2 $ data |を変更しましたか? %{$ _。CheckData2 = $ CheckObj}し、すべてのオブジェクトを最初から作成しましたか? –

答えて

0

もう少し掘り下げた後、私はある程度理解しました。

私はシンプルな$ b = $ a割り当てを使用していますが、これは浅いコピーの形に見えます。したがって、$ bの変更はオブジェクト$ aにも影響し、その逆もあります。

私の目的のために、私はデータの個別のコピーを必要とする、解決策は、この記事の解決策に類似深いコピーを行うことですようだ: PowerShell copy an array completely

だから、私に希望を与えて動作するコード、結果は次のようになります。

Function Copy-Object ($Source,[switch]$DeepCopy) { 
     # Serialize and Deserialize data using BinaryFormatter 
     if ($DeepCopy) { 
      $ms = New-Object System.IO.MemoryStream 
      $bf = New-Object System.Runtime.Serialization.Formatters.Binary.BinaryFormatter 
      $bf.Serialize($ms, $Source) 
      $ms.Position = 0 

      #Deep copied data 
      $Target = $bf.Deserialize($ms) 
      $ms.Close() 
      Write-Output $Target 
      } 
     Else { 
      Write-Output $Source 
      } 
     } 


$Data = "" | select hostname,IP 
$data.Hostname = "server1" 
$data.IP = "192.168.1.10" 

$Ids = ('7.1.1.1','7.1.1.2') 
$CheckObj= @() 
foreach ($id in $IDs) { 
    $row = "" | Select-Object CheckID,CheckData,CheckDataRaw 
    $row.CheckID = $id 
    $row.CheckData = "NotChecked" 
    $CheckObj += $row 
    } 


$Data = Copy-Object -source $Data -DeepCopy | Select *,CheckData2 

$Data | % {$_.CheckData2 = Copy-Object -source $CheckObj -DeepCopy} 

$FinalReport = Copy-Object -source $Data -DeepCopy | Select-Object -Property hostname,IP -ExpandProperty Checkdata2 
$FinalReport | ft 

出力ビーイング:

CheckID CheckData CheckDataRaw hostname IP   
------- --------- ------------ -------- --   
7.1.1.1 NotChecked    server1 192.168.1.10 
7.1.1.2 NotChecked    server1 192.168.1.10 
関連する問題