让我们创作书籍
$a = New-Object –TypeName PSObject
$a | Add-Member –MemberType NoteProperty –Name Title –Value "Journey to the West"
$a | Add-Member –MemberType NoteProperty –Name Price –Value 12
$b = New-Object –TypeName PSObject
$b | Add-Member –MemberType NoteProperty –Name Title –Value "Faust"
$b | Add-Member –MemberType NoteProperty –Name Author –Value "Goethe"
$array1 = $a,$b
$array2 = $b,$a现在让我们显示这两个数组
PS D:\Developpement\Powershell> $array1
Title Price
----- -----
Journey to the West 12
Faust
PS D:\Developpement\Powershell> $array2
Title Author
----- ------
Faust Goethe
Journey to the West因此,据我所知,这基本上意味着powershell认为数组的属性是它的第一个元素的属性(事实上,这甚至不是真的,因为如果第一个元素是$null,那么下一个元素将被考虑)。这也意味着:
Get-Member,则只会获得第一个元素的成员Convert-ToCvs,则只为第一个元素定义的属性导出属性值。我很难理解这背后的原因,这种行为让我在powershell中使用异构数组时感到非常痛苦。
我想从各种外部源导入数据,处理它们,然后将它们导出到cvs文件中。项目是相似的,但它们中的大多数都忽略了一些无法预料的属性。在Powershell中,有什么明显的方法可以在不重新编程的情况下处理这个问题吗?
发布于 2016-03-12 13:48:37
这是必须的方式,因为PowerShell使用管道。当你跑到前任的时候。$array1 | Export-CSV ....,PowerShell在第一个对象到达时就开始写入CSV文件.此时,它需要知道头文件的样子,因为它是csv文件中的第一行。因此,PowerShell必须假定第一个对象的类/属性表示管道中所有剩余的对象。Format-Table和类似的命令也是如此,它们需要在输出任何对象之前设置样式/视图。
通常的解决方法是使用Select-Object手动指定标头。它将向所有值为$null的对象添加所有缺失的属性。这样,所有的对象都被发送给了前妻。Export-CSV将定义所有相同的属性。
要获取标头,需要从数组中的所有对象接收所有唯一的属性名。例如。
$array1 |
ForEach-Object { $_.PSObject.Properties} |
Select-Object -ExpandProperty Name -Unique
Title
Price
Author然后,在将对象发送到Select-Object -Properties Title,Price,Author Ex之前,可以将其指定为使用Export-CSV的头:
$a = New-Object –TypeName PSObject
$a | Add-Member –MemberType NoteProperty –Name Title –Value "Journey to the West"
$a | Add-Member –MemberType NoteProperty –Name Price –Value 12
$b = New-Object –TypeName PSObject
$b | Add-Member –MemberType NoteProperty –Name Title –Value "Faust"
$b | Add-Member –MemberType NoteProperty –Name Author –Value "Goethe"
$array = $a,$b
$AllProperties = $array |
ForEach-Object { $_.PSObject.Properties} |
Select-Object -ExpandProperty Name -Unique
$array | Select-Object -Property $AllProperties | Export-CSV -Path "mycsv.out" -NoTypeInformation这将创建这个CSV-文件:
"Title","Price","Author"
"Journey to the West","12",
"Faust",,"Goethe"如果您有多个数组,您可以像下面的$array = $array1 + $array2那样组合它们
https://stackoverflow.com/questions/35957974
复制相似问题