2017-03-07 3 views
1

私は、ほとんどがプロパティの数が異なるオブジェクトのリストを返すスクリプトを書いています。私はコンソールでそれを印刷すると問題はありませんが、CSVにエクスポートしようとすると、すべてのオブジェクトに共通するフィールドだけがエクスポートされます。他のすべては切り取られます。混合型オブジェクトをcsvファイルにエクスポートするにはどうすればよいですか?

Add-Memberコマンドレットを使用してプロパティを追加しますが、すべてのオブジェクトが同じ数のプロパティを取得するわけではありません。

FirstObject:{ 
    Network0:nic1, 
    Network1:nic2, 
    Network2:nic3, 
    Network3:nic4, 
    Name:VirtualMachine1 
} 

SecondObject:{ 
    Network0:nic1, 
    Network1:nic2, 
    Name:VirtualMachine1 
} 

ネットワークプロパティがAdd-Memberコマンドレットを使用して追加されます。

たとえば、私は1つが、このようなものです2つのオブジェクトをエクスポートしてみてください。 CSVにエクスポートすると、最初のオブジェクトのNetwork2Network3のプロパティが切り取られ、取得するすべての列がNetwork0,Network1、およびNameになります。

すべてのプロパティをエクスポートする方法があります。オブジェクトの1つにプロパティがない場合は、$nullを割り当てますか?

P.S.これらのフィールドを手作業でループに追加するだけの解決策がありますが、私が見逃したPowerShellに組み込まれたよりクリーンなソリューションがあるのだろうかと疑問に思っていましたか?

更新:

私はそれが第一の目的にしているファイルに同じ列を提供していることが分かりました。その他のフィールドはすべて無視されます。もっと正確には、すべてのオブジェクトのすべての列が必要です。一部のオブジェクトにフィールドがない場合は、空に印刷する必要があります。

+0

エクスポートするために現在使用しているコードを確認すると便利です。 –

+0

私はこれらすべてのオブジェクトをパイプライニングして - > | export-csv -notypeinformation exported.csv – SokIsKedu

答えて

2

不足しているプロパティを追加するわずか数行のコード。注意すべき

#sample setup 
$one = [pscustomobject]@{ 
    Network0='nic1' 
    Network1='nic2' 
    Network2='nic3' 
    Network3='nic4' 
    Name='VirtualMachine1' 
} 


$two = [pscustomobject]@{ 
    Network0='nic1' 
    Network1='nic2' 
    Name='VirtualMachine2' 
} 

$three = [pscustomobject]@{ 
    Network0='nic1' 
    Name='VirtualMachine3' 
} 

$export = ($one,$two,$three) 

#build list of all properties available to $allProps 
$export | % -begin { $allProps = @() } -process { $allProps = [linq.enumerable]::union([object[]](($_.psobject.Properties).Name), [object[]]$allProps) } 

#convert each object in $export to new custom object having all properties and put to $result 
$export | % -begin { $result = @() } -process { $__ = $_; $o = @{ }; $allProps | %{ $o += @{ $_ = $__.$_ } }; $result+=[pscustomobject]$o } 

#export $result to csv 
$result | Export-Csv $env:TEMP\export.csv -NoTypeInformation -Force 

Get-Content $env:TEMP\export.csv 

"Network1", "Network3", "Network0", "Name", "Network2" 
"nic2", "nic4", "nic1", "VirtualMachine1", "nic3" 
"nic2",, "nic1", "VirtualMachine2", 
,, "nic1", "VirtualMachine3", 
>> Script Ended 

もの:

  • [linq.enumerable]::unionは、すべてのオブジェクト間で使用可能なすべてのプロパティを簡単にビルドリストに使用されています。
  • ($_.psobject.Properties).Name@($_.psobject.Properties | select -ExpandProperty Name)へのショートカットであり、それはプロパティ名の配列を含ん
  • $__ = $_nested loop
  • $o += @{ $_ = $__.$_ }ためのトリックは、出力オブジェクトにキーと値のペアを追加しています。ここでは、$_='nic4'という属性が$__のエクスポートオブジェクトに存在しない場合でも、powershellはエラーをスローせずに$ nullを返します。 Set-StrictMode-Version 2以降に設定されている場合、これは機能しません。
+0

ありがとうございました!おそらく私が見た中で最も難しいライナーです。注意していただきたいことをありがとう、本当に有益です:) – SokIsKedu

関連する問題