我正在制作一个脚本,该脚本进行 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)"
使用计算属性:
$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 ';'