Добавить пару значений динамического ключа в PSCustomObject - PullRequest
1 голос
/ 15 апреля 2019

У меня есть скрипт, который выдает значения, разделенные запятыми, для определенной переменной, и она всегда динамическая, как я могу разделить их на несколько пар ключ-значение, я попробовал следующее, но выходной массив дает только значения [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

Номассив состоит из всех значений, как показано ниже, некоторые виртуальные машины имеют от Tag1 до Tag 5, но я получаю только VMtag [0] и VMtag 1 , может кто-нибудь помочь ?, я хотел, чтобы все значения тега были частьюcsv.

enter image description here

1 Ответ

1 голос
/ 15 апреля 2019

таблица создается по первому объекту.Если вы хотите отобразить все столбцы:

$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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...