2017-03-07 57 views
1

我正在写一个脚本,它返回一个对象列表,其中大多数对象具有不同数量的属性。当我在控制台中打印时,一切正常,但是当我尝试导出到CSV时,只有那些在所有对象中通用的字段才会导出。所有其他人都裁剪。如何将混合型对象导出到csv文件?

我使用Add-Member cmdlet添加更多属性,但并非所有对象都获得相同数量的属性。

比如我尝试导出2名对象,其中一个是这样的:添加

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

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

的网络属性与Add-Member cmdlet的。导出为CSV时出现的问题是,第一个对象的Network2Network3属性会被裁剪,并且我得到的所有列都是Network0Network1Name

我想知道的是有办法导出所有的属性,如果其中一个对象没有属性,只需指定$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