将动态键值对添加到PSCustomObject

问题描述 投票:1回答:1

我有一个脚本,它发出特定变量的逗号分隔值,它总是动态的,我如何将它们分成多个键值对,我尝试下面但输出数组只给出值[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给我相同

enter image description here

但是数组包含如下所示的所有值,一些VM有Tag1到Tag 5,但我只得到VMtag [0]和VMtag1,可以有一个帮助吗?我希望所有标记值都是export csv的一部分。

enter image description here

powershell
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.