2017-02-14 1 views
2

У меня есть два наборов данных один представляет собой таблицу данных отстранился от даты SQL базы, а другой набор данных отстранился от активной директориизаписи Matching в массивах 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, где совпадение имен, а затем сделать некоторые вещи.

}

EDIT

Так что я попробовал этот

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 "отмечают, что, с -как, вы получите обратно фактические значения, а не Boolean Истина или Ложь"

Так я ожидал

$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 возможно хороший возможности.

Смежные вопросы