我需要搜索一个自定义的PowerShell对象数组(包含来自AD和Exchange的数据 - 5列:邮件,dn,extensionAttribute7,TotalItemSize,Count)。我每天收集这些数据(对于总项目大小>指定大小的每个用户),并使用Export-Clixml将其导出到XML文件中,以便在随后的几天中引用数据。每天我都会执行新的搜索,查找大于指定大小的邮箱,并保存有关匹配邮箱的数据,但我需要交叉引用现有的用户数组。如果用户已经在我的数组中,则我想将PS对象中的计数属性增加1,否则我想将用户作为新的PS自定义对象添加到我的数组中。这样我就可以跟踪邮箱始终超过指定大小的用户并相应地采取行动(这是客户要求)。
我遇到困难的部分是在我的自定义PS对象数组中搜索匹配项,以确定是否需要将用户添加为新对象或仅递增用户的计数器,因为它们已经在我的数组中。最初,我认为可以使用.IndexOf或-Contains在我的数组中找到匹配项,但它们似乎不适用于包含PS对象的数组。我唯一能够使其正常工作的方式如下:
这样做是否更有效率,因为IndexOf比为每个用户执行Where-Object要快?
我已经搜索和测试了好几天,但还是无法弄清楚。我相对而言比较新手,所以可能会错过一些非常明显的东西。谢谢!
我遇到困难的部分是在我的自定义PS对象数组中搜索匹配项,以确定是否需要将用户添加为新对象或仅递增用户的计数器,因为它们已经在我的数组中。最初,我认为可以使用.IndexOf或-Contains在我的数组中找到匹配项,但它们似乎不适用于包含PS对象的数组。我唯一能够使其正常工作的方式如下:
#Check to see if this user is already in our master mbxlist array from previous days
$ndx = 0..($mbxlist.length - 1) | Where-Object {$mbxlist[$_].mail -eq $($m.mail)}
$ndx 是在我的数组中匹配对象的索引,如果没有匹配,则为$null。但这似乎不是很高效,特别是当我需要每天检查每个单独用户的数组中有1000多个对象时。肯定有更好的方法来解决这个问题?我考虑创建一个单独的字符串数组,仅包含用户的邮件地址,然后使用indexof来检查是否匹配。我可以推断出匹配的PS对象将具有与我的字符串数组相同的索引号,然后相应地更新ps对象数组中的计数:
# Create an array of strings based on the mail attribute in my PS object array
foreach ($m in $mbxlist) {[array]$lookup += $m.mail.ToString()}
#Search the lookup array for matching email address using IndexOf
$ndx=[array]::indexof($lookup,"joe.bloggs@mydomain,com")
#If ndx > 0 I've got a match so increment the count in the corresponding PS object
If ($ndx -ge 0)
{
$mbxlist[$ndx].Count = ($mbxlist[$ndx].Count) + 1
}
这样做是否更有效率,因为IndexOf比为每个用户执行Where-Object要快?
我已经搜索和测试了好几天,但还是无法弄清楚。我相对而言比较新手,所以可能会错过一些非常明显的东西。谢谢!