将动态键值对添加到PSCustomObject

时间:2019-04-15 15:26:12

标签: powershell

我有一个脚本,该脚本针对特定变量发出逗号分隔的值,并且该变量始终是动态的,我如何将它们分成多个键值对,我尝试了以下操作,但输出数组仅给出values [0]和{{3 }}

$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也能得到相同的结果

1

但是该数组由所有值组成,如下所示,某些VM具有Tag1到Tag 5,但是我只有VMtag [0]和VMtag enter image description here,可以帮一个忙吗?,我想要所有标签值成为导出csv的一部分。

1

1 个答案:

答案 0 :(得分:1)

根据第一个对象创建表。如果要显示所有列:

$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