如何将混合类型对象导出到 csv 文件?
How to export mixed type objects to csv file?
我正在编写一个脚本,其中 returns 一个对象列表,其中大多数对象具有不同数量的属性。当我在控制台中打印它时,一切正常,但是当我尝试导出到 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 时遇到的问题是第一个对象的 Network2
和 Network3
属性被裁剪,我得到的所有列都是 Network0
、Network1
和 Name
.
我想知道有没有一种方法可以导出所有属性,如果其中一个对象没有 属性,只需分配 $null
?
P.S。我有一个解决方案,只是通过循环手动添加这些字段,但我想知道是否有一个我错过的内置于 PowerShell 中的更清洁的解决方案?
更新:
我发现它为第一个对象中的文件提供了相同的列。所有其他字段都将被忽略。所以更准确地说,我需要所有对象中的所有列。如果某些对象没有该字段,则应将其打印为空。
只需几行代码即可添加缺少的属性。
#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 也不会抛出错误和 returns $null。请注意,当 Set-StrictMode
设置为 -Version 2
或更高版本时,这将不起作用。
我正在编写一个脚本,其中 returns 一个对象列表,其中大多数对象具有不同数量的属性。当我在控制台中打印它时,一切正常,但是当我尝试导出到 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 时遇到的问题是第一个对象的 Network2
和 Network3
属性被裁剪,我得到的所有列都是 Network0
、Network1
和 Name
.
我想知道有没有一种方法可以导出所有属性,如果其中一个对象没有 属性,只需分配 $null
?
P.S。我有一个解决方案,只是通过循环手动添加这些字段,但我想知道是否有一个我错过的内置于 PowerShell 中的更清洁的解决方案?
更新:
我发现它为第一个对象中的文件提供了相同的列。所有其他字段都将被忽略。所以更准确地说,我需要所有对象中的所有列。如果某些对象没有该字段,则应将其打印为空。
只需几行代码即可添加缺少的属性。
#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 也不会抛出错误和 returns $null。请注意,当Set-StrictMode
设置为-Version 2
或更高版本时,这将不起作用。