3

我是 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"
4

2 回答 2

2

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

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

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

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


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

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

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

注意 array2, 3是如何变成 string'2 3'的。

于 2019-03-11T17:05:18.223 回答
1

其他ObjectPipedStuff | 选择对象名称、IPV4 地址 | export-csv PP.csv -NoTypeinformation

于 2020-11-18T17:05:40.117 回答