如何删除花括号并在csv文件中获得正确的输出

时间:2019-03-23 10:58:02

标签: powershell

我正在尝试使用nutanixname, ipaddress,获取System.String[]的列表 我收到的输出包括带花括号的ipaddress,其输出为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

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

我写的脚本如下-

10.x.x.x

预期的输出应该是一些IP地址,例如@{ipAddresses=System.String[]},但是我会得到Public Function CalculateBasedOnAlphabetIndex(ByVal strFormulaToEvaluate As String) As Double Application.Volatile Dim i As Long, strLetter, dblNumber As Double, varValue As Variant strFormulaToEvaluate = UCase(strFormulaToEvaluate) On Error Resume Next For i = 65 To 90 strLetter = Chr(i) Err.Clear varValue = WorksheetFunction.VLookup(strLetter, Range("AlphaLookup"), 2, False) If Err.Description = "" Then dblNumber = varValue Else dblNumber = i - 65 + 1 End If strFormulaToEvaluate = Replace(strFormulaToEvaluate, Chr(i), dblNumber, , , vbTextCompare) Next On Error GoTo 0 CalculateBasedOnAlphabetIndex = Evaluate(strFormulaToEvaluate) End Function

1 个答案:

答案 0 :(得分:3)

发生这种情况是因为$vmachine.ipAddresses是一个字符串数组对象。您需要具有受控格式的字符串表示形式。有很多方法可以完成此任务。这是一个将使用;连接多个IP(如果存在)的IP。如果只有一个IP,则不会出现分号:

$obj.ipAddresses = $vmachine.ipAddresses -join ";"

这是您的情况的一个示例:

$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的{​​{1}}属性转换为字符串会强制PowerShell将该属性解释为字符串而不是集合。因此,括号符号($obj)消失了。

{}

还有其他一些方法可以将$obj.ip = $ip -join ";" $obj | convertto-csv #TYPE Selected.System.String "name","ip" "test","10.1.23.45" 属性值设置为字符串:

ip

说明:

运行$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. ConvertTo-Csv时,将使用Export-Csv方法转换输入对象属性。如果该对象属性的引用类型(在这种情况下为ToString())没有对System.Array方法的覆盖,则该方法将返回该属性的标准类型名称。在这种情况下,该FQTN为ToString()。稍加挖掘就可以预测到这一点。

使用System.Object[]进行测试,您希望字符串转换提供整数数据的字符串表示形式,因为它确实具有覆盖:

[Int32]

使用$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 进行测试,您将期望字符串转换提供数组数据的字符串表示形式,因为它没有具有覆盖: / p>

[Array]

有关补充说明和示例,请参见Export-CsvObject.ToString Method