PowerShell哈希表密钥问题

PowerShell哈希表密钥问题,powershell,hashtable,Powershell,Hashtable,也许我做得不对,但是当我尝试使用该键引用哈希表成员时,我没有得到任何结果,但是当我使用相同的键过滤.GetEnumerator()输出时,我得到了一个结果 这不起作用: $year = "2015" $msol_year_members_table = @{} foreach ($member in $(Get-MsolGroupMember -GroupObjectId $(Get-MsolGroup | ?{ $_.DisplayName -eq $("Class of " + $year)

也许我做得不对,但是当我尝试使用该键引用哈希表成员时,我没有得到任何结果,但是当我使用相同的键过滤.GetEnumerator()输出时,我得到了一个结果

这不起作用:

$year = "2015"
$msol_year_members_table = @{}
foreach ($member in $(Get-MsolGroupMember -GroupObjectId $(Get-MsolGroup | ?{ $_.DisplayName -eq $("Class of " + $year) }).ObjectId)) {
    $msol_year_members_table[$member.ObjectId] = $member
}

foreach ($mb in $(Get-Mailbox -ResultSize Unlimited)) {
    if ($msol_year_members_table.ContainsKey($($mb.ExternalDirectoryObjectId))) {
        $msol_year_members_table[$($mb.ExternalDirectoryObjectId)]
    }
}
不过,这样做是可行的:

foreach ($mb in $(Get-Mailbox -ResultSize Unlimited)) {
    if ($result = $msol_year_members_table.GetEnumerator() | ?{ $_.Name -eq $($mb.ExternalDirectoryObjectId) }) {
        $result
    }
}

任何指针都会被欣赏——假设这是一个愚蠢的错误。

您确定键和测试值之间没有类型不匹配吗? 使用
.containskey()
方法时,参数值必须与键的类型相同,但使用
.getenumerator()
方法时,
-eq
测试将尝试将.Name值和测试值强制为操作的相同类型:

$ht = @{
1 = 'one'
2 = 'two'
3 = 'three'
}

$ht['1']

$ht.GetEnumerator() |? { $_.name -eq '1'}

Name                           Value                                                                      
----                           -----                                                                      
1                              one                                                                        

这是我的工作代码-为了防止对任何人有所帮助,我使用它将目录同步组的通讯簿策略分配给Office 365邮箱:

# Years to be processed
$years = @("2015","2016","2017","2018","2019","2020","2021","2022","2023","2024","2025","2026","2027")

# Loop through each year and retrieve the members for the groups
$msol_year_members_table = @{}
foreach ($year in $years) {
    foreach ($member in $(Get-MsolGroupMember -GroupObjectId $(Get-MsolGroup | ?{ $_.DisplayName -eq $("Class of " + $year) }).ObjectId)) {
        $key = $member.ObjectId.ToString()
        $msol_year_members_table[$key] = $member
    }
}

# Loop through the mailboxes and set the mailbox poilicies for matching members
foreach ($mb in $(Get-Mailbox -ResultSize Unlimited)) {
    $key = $mb.ExternalDirectoryObjectId.ToString()
    if ($msol_year_members_table.ContainsKey($key)) {
        $alias = $msol_year_members_table[$key].Alias; $alias_split = $alias.Split(".")
        $year = $alias_split[$alias_split.Length-1)]
        Set-Mailbox -Identity $alias -AddressBookPolicy $("Class of " + $year + " ABP")
    }
}

您正在通过
$member.ObjectId
键为哈希表赋值,但随后工作循环将与
$\uuuu.Name
进行比较?是否希望通过
$member.Name
分配初始分配循环?请查看。我想你可以用内置的方法完成任何你想做的事情,比如Get Item、Add、Remove等。Etan,我很确定$\ uName和$\ uKey是相同的-我刚刚测试了切换这两个成员名称,它是有效的-你看到的是代码的工作部分,而不是我遇到问题的部分。Caleb,我刚刚用.Get_Item()函数进行了测试,但我遇到了同样的问题,仍然没有得到任何结果:(您是否考虑过在($msol_year_members_table.keys-包含$mb.ExternalDirectoryObjectId)时执行
操作($mb.ExternalDirectoryObjectId.ToString())
。请将解决方案作为答案发布。不要编辑答案并将其添加到您的问题中。谢谢,伙计-看起来它们是不同的类型。我将发布一个更新,其中包含现在对我有效的内容。类型不匹配也是我使用的问题
($ht.GetEnumerator()|?{$\u.Name-eq'1')。Name.GetType()
确定哈希表的类型,发现哈希表使用的是
[int32]
,但我的查找值是
[uint32]
。他们说类型必须完全匹配,这不是开玩笑!