Powershell导出到CSV的数组,提供数组属性

时间:2017-05-25 17:20:27

标签: powershell export-to-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上"&# 34; IsReadOnly"" IsFixedSize"" IsSynchronized"   " 43"" 43"" 43"" 1"" System.Object的[]&#34 ;, "假""真""假"

...数组的属性是什么,而不是数组的成员。谷歌搜索我发现的唯一建议似乎是实现一个整体忽略Export-Csv的解决方案,处理字符串(虽然字符集合,解决方案不适用)或似乎正在做我正在做的事情。我已经做了但生成了一个有效的CSV文件(我可以找到一些链接,如果需要,但他们是论坛对话,而不是明确的指南)。

如何将PSObject数组正确导出为CSV文件,并避免上述意外输出?

2 个答案:

答案 0 :(得分:3)

使用管道提供输入:

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

当您将相同的输入传递给-InputObject时,确实数组作为整体被解释为要导出的单个对象。

此行为会影响所有 cmdlet,显然是as designed

  

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

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

Export-CsvConvertTo-Csv都不属于该类别,即使 Get-Help ExportCsv目前误导性地描述-InputObject参数(强调添加)

  

指定要导出为CSV字符串的对象 s 输入包含对象 s 的变量,或键入获取对象 s 的命令或表达式。您也可以管道对象导出为Export-CSV。

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

答案 1 :(得分:1)

使用CSV(逗号分隔值)文件是将数据转换为易于阅读的格式的最佳,最简便的方法之一。 CSV文件将包含一行标题,以指示列名和每列的后续值。在CSV文件中定位需要结构化数据

#looping the concerningMachines details to print in the excel cell
$concerningMachines | foreach { Add-Content -Path $FilePathLocation -Value $_ }