如何将混合类型对象导出到csv文件?

时间:2017-03-07 07:48:15

标签: powershell object export-to-csv mixed

我正在编写一个脚本,该脚本返回大多数具有不同数量属性的对象列表。当我在控制台中打印它时一切正常,但是当我尝试导出到CSV时,只会导出所有对象中常见的字段。所有其他人都被裁剪了。

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

例如,我尝试导出2个对象,其中一个是这样的:

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

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

Network属性添加了Add-Member cmdlet。导出到CSV时遇到的问题是第一个对象的Network2Network3属性被裁剪,我得到的所有列都是Network0Network1和{{ 1}}。

我想知道的是有一种导出所有属性的方法,如果其中一个对象没有属性,只需指定Name

P.S。我有一个解决方案,只是用循环手动添加这些字段,但我想知道是否有一个更清洁的解决方案内置PowerShell我错过了?

更新

我发现它为第一个对象中的文件提供了相同的列。所有其他字段都被忽略。所以更确切地说,我需要所有对象中的所有列。如果某些对象没有该字段,则应将其打印为空。

1 个答案:

答案 0 :(得分:3)

只需几行代码即可添加缺少的属性。

#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或更晚时,此功能无效。