我有一个脚本,它发出特定变量的逗号分隔值,它总是动态的,我如何将它们分成多个键值对,我尝试下面但输出数组只给出值[0]和1
$tagsd = @()
foreach ($a in $vms)
{
$tags = (($a.ExtensionData.GetResourceProperties()).property | ?{$_.name -eq 'summary|tag'}).value.TrimStart('[').TrimEnd(']').split(",").trim()
#<vSphere Tag-Production>, <Cost Center-90210>
$Object = [pscustomobject][ordered]@{
VmName = $a.name
}
0..$tags.count | % {
Add-Member -InputObject $Object -NotePropertyName "VMtag$_" -NotePropertyValue $tags[$_]
}
$tagsd += $Object
}
但输出如下,即使导出csv给我相同
但是数组包含如下所示的所有值,一些VM有Tag1到Tag 5,但我只得到VMtag [0]和VMtag1,可以有一个帮助吗?我希望所有标记值都是export csv的一部分。
该表是根据第一个对象创建的。如果要显示所有列:
$propNames = $tagsd | foreach { $_.psobject.Properties.Name } | select -Unique
$tagsd | select $propNames
此外,您的代码看起来还有其他问题。
如果$tags
只有一个值(例如$tags = "none"
),$tags[0]
将返回第一个字符“n”而不是字符串“none”。所以你可以通过[array]$tags = ...
或$tags = @(...)
解决这个问题。
此外,范围应该是0..($tags.Count -1)
而不是0..$tags.Count
。
$tagsd = @()
foreach ($a in $vms) {
[array]$tags = (($a.ExtensionData.GetResourceProperties()).Property | where { $_.Name -eq 'summary|tag' }).Value.TrimStart('[').TrimEnd(']').Split(",").Trim()
$object = [pscustomobject]@{ VmName = $a.Name }
if($tags.Count) {
0..($tags.Count - 1) | foreach {
$object | Add-Member -NotePropertyName "VMtag$_" -NotePropertyValue $tags[$_]
}
}
$tagsd += $object
}
如果可能,最好避免对数组进行索引访问。
$tagsd = foreach ($a in $vms) {
$tags = (($a.ExtensionData.GetResourceProperties()).Property | where { $_.Name -eq 'summary|tag' }).Value.TrimStart('[').TrimEnd(']').Split(",").Trim()
$h = [ordered]@{ VmName = $a.Name }
$tags | foreach { $i = 0 } { $h.Add("VMtag${i}", $_); $i++ }
[pscustomobject]$h
}
$propNames = $tagsd | foreach { $_.psobject.Properties.Name } | select -Unique
$tagsd | select $propNames