首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何删除花括号并在csv文件中获得适当的输出

如何删除花括号并在csv文件中获得适当的输出
EN

Stack Overflow用户
提问于 2019-03-23 10:58:02
回答 1查看 1.4K关注 0票数 2

我试图用vmnutanix获得name, ipaddress,的列表,我正在接收的输出包括带大括号的ipaddress,它将输出作为System.String[]

我使用for循环获取数组中的所有值,而不是将值导出到csv。

我所写的剧本如下-

代码语言:javascript
复制
foreach ($vmachine in $vm){
   $obj = "" | Select "vmName", "ipAddresses", "description", "protectionDomainName", "powerState"
   $obj.vmName = $vmachine.vmName
   $obj.ipAddresses = $vmachine.ipAddresses
   $obj.description = $vmachine.description
   $obj.protectionDomainName = $vmachine.protectionDomainName
   $obj.powerState = $vmachine.powerState

   $outArrayVM += $obj
   $obj =$null
}
$outArrayVM | Export-Csv d:\z.csv

预期的输出应该是一些be地址,比如10.x.x.x,但是我得到了@{ipAddresses=System.String[]}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-23 12:34:59

这是因为$vmachine.ipAddresses是一个字符串数组对象。您需要一个具有受控格式的字符串表示形式。要做到这一点,有很多方法。下面是使用;连接多个IP(如果存在的话)的一个。如果只有一个IP,它将不带分号出现:

代码语言:javascript
复制
$obj.ipAddresses = $vmachine.ipAddresses -join ";"

下面是您的场景的一个示例:

代码语言:javascript
复制
$ip = @("10.1.23.45")
$ip.gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

$obj.name = "test"
$obj.ip = $ip
$obj

name ip
---- --
test {10.1.23.45}

$obj | convertto-csv

#TYPE Selected.System.String
"name","ip"
"test","System.Object[]"

ip属性$obj转换为string会迫使PowerShell将该属性解释为字符串而不是集合。这样,大括号符号({})就消失了。

代码语言:javascript
复制
$obj.ip = $ip -join ";"
$obj | convertto-csv

#TYPE Selected.System.String
"name","ip"
"test","10.1.23.45"

下面是将ip属性值设置为字符串的其他一些选项:

代码语言:javascript
复制
$obj.ip = -join $ip # No join character here. Works best with only one IP.
$obj.ip = $ip[0] # Accesses first element of array $ip, which will be a string. Only works with one IP.
$obj.ip = [string]$ip # Uses string type accelerator to cast $ip as string. This will join multiple IPs with a space between each IP.

Explanation:

运行ConvertTo-CsvExport-Csv时,使用ToString()方法转换输入对象属性。如果该对象属性的引用类型(在本例中为System.Array)没有覆盖ToString()方法,则该方法将返回该属性的完全限定类型名称。在这种情况下,FQTN是System.Object[]。经过一点挖掘,这是可以预见的。

使用[Int32]进行测试时,您可能希望字符串转换提供整数数据的字符串表示形式,因为确实有一个覆盖:

代码语言:javascript
复制
$int = 1
$int.gettype().fullname

System.Int32

($int | Get-Member).where{$_.Name -eq "ToString"}

   TypeName: System.Int32

Name     MemberType Definition
----     ---------- ----------
ToString Method     string ToString(), string ToString(string format), string ToString(System.IFormatProvider provid...

$int.ToString()
1
$int.ToString().gettype().fullname
System.String

使用[Array]进行测试时,not会期望字符串转换提供数组数据的字符串表示形式,因为没有覆盖:

代码语言:javascript
复制
$arr = [array]1
$arr.gettype().fullname
System.Object[]
([System.Object[]] | Get-Member -Static).where{$_.name -eq "ToString"}

$arr.toString()
System.Object[]

有关补充说明和示例,请参见出口-CsvObject.ToString法

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55312981

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档