powershell hashtable.containsValue返回false,但循环值是否匹配?

时间:2011-02-22 00:43:46

标签: powershell hashtable

所以我正在尝试在PowerShell中创建一个函数,该函数嵌套用户在广告中成员的所有组。我将组映射到哈希表中,使用AD中的公用名作为值。

这很顺利,该函数返回一个包含我所有组的哈希表。但是当我使用它查询它 $group = "IT-Avd" $groups.ContainsValue($group)

它返回false - 但是当我遍历值并进行相同的比较时,我确实得到了匹配!发生了什么事?

function get-groupmemberships ($workDN){
    $ADobj = [ADSI]"LDAP://$workDN"     
    foreach ($currGroup in $ADobj.memberOf.Value){
        if (!($currGroup -eq $null)){
            #Write-Host "displayN:" $grpDetails.Name " | dn:" $currGroup " | "
            if(!$groups.ContainsKey($currGroup)){
                $grpDetails = [ADSI]"LDAP://$currGroup"
                $groups.Add($currGroup,$grpDetails.Name)
                #Write-Host "Adding new pair, " $grpDetails.Name " | " $currGroup
                get-groupmembership $currGroup
            }
        }
    }
    return $groups
}

function get-DN ($SAMToFetch){
    $strFilter = "(samAccountName=$SAMToFetch)"
    $objSearcher = New-Object System.DirectoryServices.DirectorySearcher
    $objSearcher.Filter = $strFilter
    $objPath = $objSearcher.FindOne()
    if($objPath){
        $objFound = $objPath.GetDirectoryEntry()
        $objDN = $objFound.distinguishedName
        return $objDN}
    else{ 
        return $false
    }
}

$groups = @{}   
write-host "Start search:",(Get-Date -Format T),",",(get-Date -format fff)
$group = "IT-Avd"
$memberOf = get-GroupMemberships (get-DN jslonsetteig)
$groups.ContainsValue($group)
foreach( $val in $groups.Values){if ($val -eq $group){Write-Host $val "<--It does seem to be there..."}}

write-host "End search:",(Get-Date -Format T),",",(get-Date -format fff)`

1 个答案:

答案 0 :(得分:3)

使用ContainsValue正在使用哈希表的线性搜索,因此您将失去哈希表通常提供的O(1)搜索的好处。您可以尝试创建另一个哈希表,而公共名称是密钥。然后你可以使用ContainsKey或者只是按名称尝试访问,看看结果是不是$ null。

BTW差异的一个原因是,当您将$group传递给ContainsValue时,PowerShell不会对类型强制执行任何操作,因为该方法参数的类型为object。但是,当它执行$val -eq $group时,PowerShell可能会做很多工作来强制$group$val的类型。虽然看起来$group已经是一个字符串了,但是有一些psobject包装错误可能会在这里发挥作用(虽然只是猜测)。如果您尝试$groups.ContainsValue('IT-Avd')会怎样?

您还可以检查哈希表中存储的类型,例如:

$groups.Values | Get-Member