2017-05-25 47 views
2

此代码的:Powershell的导出到CSV阵列提供阵列属性

$concerningMachines = @() 
foreach($aMachine in $machineRecords.GetEnumerator()) 
{ 
    if($aMachine.Value.ReviewScore -gt $averageAboveAverage) 
    { 
     $machine = New-Object -TypeName PSObject 
     $machine | Add-Member -MemberType NoteProperty -Name MachineName -Value $aMachine.Key 
     $machine | Add-Member -MemberType NoteProperty -Name ManagedBy -Value $aMachine.Value.ManagedBy 
     $machine | Add-Member -MemberType NoteProperty -Name LastLogin -Value $aMachine.Value.LastLogin 
     $machine | Add-Member -MemberType NoteProperty -Name ReviewScore -Value ($aMachine.Value.ReviewScore/$averageAboveAverage * 100) 
     $concerningMachines += $machine 
    } 
} 

Export-Csv -InputObject $concerningMachines -Path C:\DG\ConcerningMachines.csv -NoTypeInformation 

可生产此.csv文件:

“计数”, “长度”, “LongLength”,“等级”, “SyncRoot上”, “IsReadOnly”, “IsFixedSize”, “IsSynchronized” “43”, “43”, “43”, “1”, “System.Object的[]”, “假”, “真”, “False”

...这是数组的属性,而不是th阵列的成员。谷歌搜索我找到的唯一的建议似乎要么实现一个完整忽略出口-CSV的解决方案,是处理字符串(其中,当字符的集合,该解决方案不适用)或似乎确切地做什么我已经在做,但生成一个有效的CSV文件(如果需要,我可以找到一些链接,但它们是论坛对话,而不是明确的指南)。

你如何正确地导出PSObjects阵列成CSV文件,并避免出现上述意外的输出?

回答

3

使用管道提供输入:

$concerningMachines| Export-Csv -Path C:\DG\ConcerningMachines.csv -NoTypeInformation 

当你传递相同的输入-InputObject,它确实是阵列作为一个整体被解释为要导出的对象。

此问题影响所有 cmdlet和显然as designed

InputObject是将要处理的单个对象。在管道中使用时,InputObject绑定到管道中的每个元素,并一次处理一个元素。如果InputObject作为集合处理,则管道中的每个项目也将作为集合处理。

有cmdlet的地方这种行为是有用的:Get-Member,例如,允许您使用-InputObject检查集合的类型作为一个整体,而管道输入检查每个元素的集合

无论Export-Csv也不ConvertTo-Csv属于这一类,即使Get-Help ExportCsv当前误导性描述了这样(加重语气)-InputObject参数

指定对象小号导出为CSV字符串。 输入包含对象小号变量或键入可获取对象小号命令或表达式。您可以将管道对象导出到CSV。

务实的结论是总是使用管道(除非你真的想传递一个集合整体)。

+2

我不能投票更多。答案总是像顶尖一样。你怎么敢质疑文档:) – Matt