我正在尝试使用nutanix
从name, 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
答案 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-Csv和Object.ToString Method。