当屏幕上的数据正常时,在 CSV 文件导出中获取 "System.Collections.Generic.List`1[System.String]"

Getting "System.Collections.Generic.List`1[System.String]" in CSV File export when data is okay on screen

我是 PowerShell 的新手,正在尝试从 Hyper-V 中获取 VM 名称列表及其关联的 IP 地址。

我在屏幕上得到的信息很好,但是当我尝试导出到 csv 时,我得到的 IP 地址在每一行上都是 "System.Collections.Generic.List`1[System.String]"。

有关于 "joins" 或 "ConvertTo-CSV" 的建议,但我不明白这些的语法。

有人可以帮忙吗?

这是我使用的语法...

Get-VM | Select -ExpandProperty VirtualNetworkAdapters | select name, IPV4Addresses | Export-Csv -Path "c:\Temp\VMIPs.csv"

如果您使用 Export-CsvConvertTo-Csv 导出为 CSV 的对象具有 属性 值,其中包含 集合 (array) 的值,这些值通过它们的 .ToString() 方法 被 字符串化,这导致无用的表示,就像你的数组值的情况一样.IPV4Addresses 属性.

使用 ConvertTo-Csv cmdlet 进行演示(其工作方式类似于 Export-Csv,但 returns CSV 数据而不是保存它到文件):

PS> [pscustomobject] @{ col1 = 1; col2 = 2, 3 } | ConvertTo-Csv
"col1","col2"
"1","System.Object[]"

也就是说,存储在 .col2 属性 中的数组 2, 3 被毫无帮助地字符串化为 System.Object[],这就是您调用 [=14= 时得到的结果] 在常规 PowerShell 数组上;其他 .NET 集合类型 - 例如 [System.Collections.Generic.List[string]] 在你的情况下 - 类似地进行字符串化;也就是说,根据他们的类型名称


假设您想要在 单个 CSV 列中表示数组值 属性 的所有值,要解决此问题 您必须 为整个集合决定一个有意义的字符串表示并使用Select-Object[=51来实现它=]:

例如,您可以使用 -join 运算符创建一个 space 分隔的元素列表:

PS> [pscustomobject] @{ col1 = 1; col2 = 2, 3 } | 
      Select-Object col1, @{ n='col2'; e={ $_.col2 -join ' ' } } |
        ConvertTo-Csv
"col1","col2"
"1","2 3"

注意数组 2, 3 是如何变成字符串 '2 3' 的。

OtherObjectPipedStuff | Select-对象名称,IPV4地址| export-csv PP.csv -NoTypeinformation