我正在通过迭代创建对象数组。有些对象是多余的,对于那些我只想更新一个属性或在创建数组后将它们合并的对象(尽管我认为这不是更好的解决方案)
最后我需要将此数组作为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语句没有任何意义,那么。这对我来说看起来很丑。您是否有更好的建议?
答案 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
之类的属性访问。
使用+=
构建数组的效率很低,因为每次添加元素时都必须在幕后创建一个新数组。