Обновить объект в массиве объектов - PullRequest
0 голосов
/ 03 мая 2019

Я создаю массив объектов путем итерации.Некоторые из объектов являются избыточными, и для тех, кто хочет просто обновить одно свойство или объединить их после создания массива (хотя я не думаю, что это лучшее решение)

Мне нужен этот массив как CSVв итоге

foreach ( $Group in $groups) {
    $groupmembers = Get-ADGroupMember -Identity $Group
    $group = Get-ADGroup -Identity $adobeGroup -properties Description
    $description = $group.description
    $i = 0 
    foreach ($member in $groupmembers) {
        if ($member.objectClass -eq "user") {
            $User = get-aduser -filter 'name -eq $member.name' -properties C, mail 
            if ($i -eq 0) {
                $Users += @(
                    [pscustomobject]@{
                        'Username'                            = $User.mail
                        'Email'                               = $User.mail
                        "Country"                             = $User.C
                        "Product Configurations"              = $description
                    }  
                )
            }
            else {
                if ($Users.Username.Contains($User.mail)) {
                    $changeme = $Users | where-object { $_.Username -eq $User.Username } | Select-Object -ExpandProperty "Product Configurations"
                    $changeme += ", " + $description
                }
                else {
                    $Users += @(
                        [pscustomobject]@{
                            'Username'                            = $User.mail
                            'Email'                               = $User.mail
                            "Country"                             = $User.C
                            "Product Configurations"              = $description
                        }  
                    )
                }            
            }
        }
        $i++
    }
}

Я ожидаю, что

if ($Users.Username.Contains($User.mail)) {
                    $changeme = $Users | where-object { $_.Username -eq $User.Username } | Select-Object -ExpandProperty "Product Configurations"
                    $changeme += ", " + $description
                }

обновит «Конфигурации продукта» с «description1» до «descrption1, description2», если я итерировал этого пользователя ранее.Фактический результат заключается в том, что «Конфигурации продукта» остаются прежними.Это не имеет ничего общего с фактическим вопросом, но я получаю сообщение об ошибке, если я не делаю оператор if $ i-eq 0, так как объект еще не создан, а второй оператор if не имеет смысла тогда,Это выглядит довольно уродливо для меня.У вас есть предложение для лучшего решения?

1 Ответ

0 голосов
/ 03 мая 2019

$changeme - это переменная string , содержимое которой вы обновляете. Он не ссылается и поэтому не обновляет свойство объекта пользователя.

Вместо этого вы должны получить объект пользователя и обновить его свойство .'Product Configurations'.

# Important: Initialize the $Users array, so you can 
#            later add [pscustomobject] instances one by one without having to
#            wrap them in an array.
$Users = @()

# ...

if ($userToChange = $Users | Where-Object { $_.Username -eq $User.mail }) {
  $userToChange.'Product Configurations' += ", " + $description
} else {
  $Users += [pscustomobject] @{
    Username                            = $User.mail
    Email                               = $User.mail
    Country                             = $User.C
    'Product Configurations'            = $description
  }  
}            

Обратите внимание, что я упростил код для поиска существующего элемента. В PSv4 + вы можете сделать это более эффективным с $Users.Where({ $_.Username -eq $User.mail }, 'First')

Несколько сторон:

  • Если вы использовали (упорядоченную) хеш-таблицу для создания своей коллекции пользовательских объектов с ключом по имени пользователя, вы могли бы найти существующую запись гораздо эффективнее.

  • Я бы не ожидал, что -Filter 'name -eq $member.name' будет работать, потому что встраивание ссылок на переменные в литеральные фильтры работает только с простыми ссылками на переменные, а не с доступом к свойствам, таким как .name.

  • Создание массива с += неэффективно, потому что новый массив должен создаваться за сценой каждый раз, когда добавляется элемент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...