我是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"
如果使用Export-Csv
或ConvertTo-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-Object
和calculated 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'
。