【问题标题】:Matching entries in arrays powershell数组powershell中的匹配条目
【发布时间】:2017-07-02 22:54:06
【问题描述】:

我有两个数据集,一个是从 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}

    }
    }

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

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

$HRusers | ForEach-Object {

在名称匹配的 AD 列表中找到匹配项,然后做一些事情。

}

编辑

所以我尝试了这个

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

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

看技术网

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

返回值但它仍然只返回真/假?

【问题讨论】:

    标签: arrays list powershell search


    【解决方案1】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2022-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多