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

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

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

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

有关于“连接”或“ConvertTo-CSV”的建议,但我不明白这些的语法。

有人可以帮忙吗?

这是我正在使用的语法...

Get-VM | Select -ExpandProperty VirtualNetworkAdapters | select name, IPV4Addresses | Export-Csv -Path "c:\Temp\VMIPs.csv"
arrays powershell csv stringify export-csv
1个回答
1
投票

如果使用Export-CsvConvertTo-Csv导出为CSV的对象具有包含值集合(数组)的属性值,则这些值将通过其.ToString()方法进行字符串化,这会导致无用的表示形式,如数组值.IPV4Addresses的情况属性。

要使用ConvertTo-Csv cmdlet(类似于Export-Csv,但返回CSV数据而不是将其保存到文件)来演示这一点:

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

也就是说,存储在2, 3属性中的数组.col2被无效地字符串化为System.Object[],这是你在常规PowerShell数组上调用.ToString()时得到的;其他.NET集合类型 - 例如你的[System.Collections.Generic.List[string]] - 类似于stringify;也就是说,按类型名称。


假设您想在单个CSV列中表示数组值属性的所有值,要解决此问题,您必须确定整个集合的有意义的字符串表示形式,并使用Select-Objectcalculated property实现它:

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

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'

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