匹配数组PowerShell中的条目

时间:2017-02-14 15:15:33

标签: arrays list powershell search

我有两个数据集,一个是从SQL日期库中拉回来的数据表,另一个是从Active Directory拉回的数据集

$HRusers = Invoke-SQL ## this calls a function to get data from SQL
$adusers = get-aduser -filter * -Properties surname,EmployeeID,DisplayName

我想将两者匹配在一起,所以我的代码目前是

    $HRusers | ForEach-Object {

    foreach ($user in $aduser){

     if ((($_.Surname -eq $user.surname) -And ($_.'First Name' -eq $user.Givenname)) -or (($_.Surname -eq $user.surname) -And ($_.'Known As' -eq $user.Givenname))) 
{ do some stuff}

    }
    }

这确实有效,但由于每个列表长达数千个,所以循环很多。

有什么方法可以进行搜索而不是循环。所以逻辑更像是

$ HRusers | ForEach-Object {

在AD列表中找到匹配的匹配项,然后执行一些操作。

}

修改

所以我试过这个

if  (($adusers.surname -eq $_.surname) -And ($adusers.Givenname -eq $_.'First Name'))
 {
 write-host "Found" $adusers.surname
 }

这会给出一个真/假答案,但我需要提取它给出匹配的$ aduser记录。

在technet上查看

https://technet.microsoft.com/en-us/library/ee692798.aspx "请注意,使用-like,您将获得实际值而不是布尔值True或False"

所以我期待

   $users = ($adusers.Givenname -like ($_.'First Name') -and $adusers.surname -like ($_.'surname'))


 write-host $users

返回值但它仍然只返回true / false?

1 个答案:

答案 0 :(得分:0)

您可以使用where-object搜索数组:

foreach ($hruser in $hrusers) {
    $adusers | where-object {$hruser.'First Name' -eq $_.givenname} | ForEach-Object {
        'do some stuff'
    }
}

或者使用Invoke-SqlCmd返回DataTable Select方法的事实:

foreach ($aduser in $adusers){
    $SelectedHrUsers = $hrusers.Select("surname='$($aduser.surname)'")
}

前者不会比嵌套数组快得多,但DataTable.Select可能具有良好的性能。