【问题标题】:Powershell Export-to-CSV of array providing array properties提供数组属性的数组的 Powershell 导出到 CSV
【发布时间】:2017-10-26 10:41:17
【问题描述】:

这段代码:

$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 文件:

"Count","Length","LongLength","Rank","SyncRoot","IsReadOnly","IsFixedSize","IsSynchronized" "43","43","43","1","System.Object[]","False","True","False"

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

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

【问题讨论】:

    标签: powershell export-to-csv


    【解决方案1】:

    使用管道提供输入:

    $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。

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

    【讨论】:

    • 我不能再投票了。答案一如既往的一流。你怎么敢质疑文档:)
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2013-10-30
      • 1970-01-01
      • 2013-10-25
      • 2019-12-23
      • 2021-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多