Powershell 展开 System.Object[] 值并转换为 Csv

问题描述 投票:0回答:1

我正在制作一个脚本,该脚本进行 RestMethod 调用并将结果导出到 CSV 在输出中,我有一个对象,其中包含代理状态和最后一个代理状态消息,但对于最后一个我只看到 System.Object[] 如何扩大价值?

下面是简单代码片段和输出示例

$r = Invoke-RestMethod @param -Headers $headers -UseBasicParsing

$r.computers | Select-Object hostName,lastIPUsed,platform,computerStatus | ConvertTo-Csv -NoTypeInformation

输出:

"hostName","lastIPUsed","platform","computerStatus"

"srv01","10.1.1.2","Red Hat Enterprise 7 (64 bit)","@{agentStatus=active; agentStatusMessages=System.Object[]}"
"srv02","10.1.2.3","CentOS 7 (64 bit)","@{agentStatus=active; agentStatusMessages=System.Object[]}"
"srv03","10.1.2.4","Microsoft Windows Server 2019 (64 bit)","@{agentStatus=active; agentStatusMessages=System.Object[]}"

预期:

"hostName","lastIPUsed","platform","AgentStatus","agentStatusMessages"

"srv01","10.1.1.2","Red Hat Enterprise 7 (64 bit)","active","Managed (Online)"
"srv02","10.1.2.3","CentOS 7 (64 bit)","active","Managed (Online)"
"srv03","10.1.2.4","Microsoft Windows Server 2019 (64 bit)","active","Managed (Online)"
powershell select-object
1个回答
0
投票

使用计算属性

$r.computers | 
  Select-Object hostName, lastIPUsed, platform,
                @{ Name='agentStatus'; Expression={ $_.agentStatus } },
                @{ Name='agentStatusMessages'; Expression={ $_.agentStatusMessages -join ';' } } | 
  ConvertTo-Csv -NoTypeInformation

注:

  • 因为

    ConvertTo-Csv
    及其基于文件的表兄弟
    Export-Csv
    都没有有意义地字符串化数组值属性,因此您必须决定如何将数组表示为单个字符串

  • 上面使用

    -join
    字符串连接运算符)从数组值
    .agentStatusMessages
    属性形成单个字符串,使用自选分隔符
    ;
    - 根据需要进行调整;如果给定数组中只有 one 元素,则分隔符不起作用。

  • 此外,由于

    .agentStatusMessages
    System.Object[]
    类型(
    [object[]]
    ,在 PowerShell 术语中)而不是 strings 数组,因此应用
    -join
    依赖于每个元素的 implicit 字符串化,这本质上是意味着对每个还不是字符串的元素调用
    .ToString()

    如果元素是复杂对象而不是字符串,并且它们的
    .ToString()
    字符串化没有帮助,则必须 显式 对它们进行字符串化,例如通过选择代表/感兴趣的属性:
    例如,假设地说,如果
    .agentStatusMessages
    数组的元素具有
    .Text
    属性,您可以依靠 member-access enumeration 来提取值并将它们连接起来:
    $_.agentStatusMessages.Text -join ';'

© www.soinside.com 2019 - 2024. All rights reserved.