【问题标题】:Exporting multiple PSCustomObject s to a single CSV将多个 PSCustomObject 导出到单个 CSV
【发布时间】:2021-04-15 19:06:07
【问题描述】:

我有 2 个 PScustomObject,我想将它们组合成一个 csv,如下所示:

 $Output1 = [PSCustomObject]@{
            Timestamp1 = (Get-Date)
            InstanceName1 = $ProcessName1
            Count1 = $Processes1.Count
            Memory1 = $MEMLoad1
            CPU1 = $CPULoad1
        } 
        $Output2 = [PSCustomObject]@{
            Timestamp2 = (Get-Date)
            InstanceName2 = $ProcessName2
            Count2 = $Processes2.Count
            Memory2 = $MEMLoad2
            CPU2 = $CPULoad2
        } 

CSV 应具有标题 TimeStamp1、InstanceName1......TimeStamp2、InstanceName2...... 此代码循环运行,每次传递都导出数据。

有没有办法做到这一点?如果我要在 100 个 PsCustomObjects 上导出数据,还有一种方法可以动态地执行此操作以避免复制大量代码,可能会查看对象的输入数据并放入一个对象并将其传递给 csv 同时动态更改标题?

我使用以下行来导出。我试过 -InputObject $Output1, $Output2 但这会产生乱码。

Export-Csv -InputObject $Output1 -path $Path1 -NoTypeInformation -Append -Force 

到目前为止,我唯一的解决方案是导出多个 CSV,但这会很快变得庞大。

非常感谢任何帮助!

【问题讨论】:

标签: powershell csv pscustomobject


【解决方案1】:

最佳解决方案是确保您的脚本/函数输出的所有对象都使用相同的架构(也就是说,它们都应该共享相同的公共属性名称)。

如果这不可行,您可以使用Select-Object 确保为所有对象选择所有可能的属性:

$Output1,$Output2 |Select-Object Count1,Count2,CPU1,CPU2,InstanceName1,InstanceName2,Memory1,Memory2,Timestamp1,Timestamp2 |Export-Csv ...

这显然不是很实用,因此如果您有许多不同的对象模式,您会希望自动发现所有可能的属性名称。

为此,我们可以检查 psobject 隐藏成员集:

$allTheObjectsToExport = $Output1,$Output2

$propertyNames = $allTheObjectsToExport |ForEach-Object {
  # Discover all the object's properties
  $_.psobject.Properties |ForEach-Object {
    # Get each property name
    $_.Name
  }
} |Sort-Object -Unique

# Now the CSV will have a column for every single unique property name
$allTheObjectsToExport |Select-Object $propertyNames |Export-Csv -Path $Path1 -NoTypeInformation

【讨论】:

    猜你喜欢
    • 2014-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-02
    • 2022-01-13
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多