更新对象数组中的对象

时间:2019-05-03 07:20:57

标签: powershell

我正在通过迭代创建对象数组。有些对象是多余的,对于那些我只想更新一个属性或在创建数组后将它们合并的对象(尽管我认为这不是更好的解决方案)

最后我需要将此数组作为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 :(得分:0)

$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之类的属性访问。

    < / li>
  • 使用+=构建数组的效率很低,因为每次添加元素时都必须在幕后创建一个新数组。