2017-02-14 50 views
2

我有两个数据集,一个是数据表从SQL日期基地拉回,另一种是从Active Directory拉回数据集匹配条目的PowerShell

$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} 

    } 
    } 

这并不工作,但作为列表中为每个数是1000长是很多循环的。

有没有什么办法可以做搜索而不是循环。所以逻辑更像

$ 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 展望 “指出,有样,你回来的实际值,而不是一个布尔真或假”

所以我预计

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


write-host $users 

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

回答

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可能会有不错的表现。