【问题标题】:Powershell where slow is there a faster way to search object?Powershell 哪里有更快的搜索对象的方法?
【发布时间】:2015-10-08 07:48:34
【问题描述】:

我有以下代码:

$HardCatUsers = Import-Csv z:\Scripts\Powershell\Hardcat_People_Export.csv

$ADUsers = Get-ADUser -Filter {enabled -eq $true -and surname -like "*" -and    GivenName -like "*" -and Name -notlike "AD*" -and Name -notlike "LRTM*"} -SearchBase "ou=Production, dc=diti, dc=lr, dc=net" | Sort-Object Surname
foreach ($ADUser in $ADUsers)
{
    if ($ADUser.Name.length -le 8)
    {
        $ADSearch = "$($ADUser.Surname), $($ADUser.GivenName) - $($ADUser.Name.ToUpper())"
        if ($Code = $HardCatUsers | Where {$_.Description -eq $ADSearch})
        {
            #"$($ADSearch) $($Code)"
        } else { 
            "$($ADSearch) NEW"
        }
    }

}

$hardCatUsers 对象只是两列数据,例如:

Description                                                     Code                                                          
-----------                                                     ----                                                          
# No Assigned User - ACTIVE #                                   ASSET MANAGEMENT                                              
# No Assigned User - SPARE #                                    NO USER SPARE                                                 

我正在做的是拉回一个过滤的 AD 用户列表并格式化三个属性,然后在 $hardcatusers 中比较/查找这个字符串,如果没有找到只是输出字符串。

但当前的实现似乎在每次查找时都非常慢,即 5 秒。有没有更优雅的方式来搜索匹配列表?

谢谢

【问题讨论】:

  • 如果您将 ADSearch 限制为搜索所需的必填字段,例如选择姓名、GivenName、姓氏、描述,是否有帮助
  • 不是很多,我将其更改为 Get-ADUser -Properties DisplayName,Name... 仍然需要很长时间,总 ADUsers 记录数约为 4800,非常大。
  • 也许您可以在初始搜索中过滤长度小于8的名称,然后这会使列表变小?

标签: powershell csv active-directory


【解决方案1】:

我发现带有 $hardcatusers 的 foreach 循环比 where 快得多

即:

foreach ($ADUser in $ADUsers)
{
    if ($ADUser.Name.length -le 8)
    {
        $found = $false
        $ADSearch = "$($ADUser.DisplayName) - $($ADUser.Name.ToUpper())"
        foreach ($HardcatUser in $HardCatUsers)
        {
            if ($HardcatUser.Description -eq $ADSearch)
            {
                $found = $true
            }
        }

        if ($found -ne $true)
        {
            $Results = New-Object PSObject -Property (@{
                                Description = $ADSearch
                                Code  = "PE" + $NextCode.ToString("000000")
                    })

            $Result += $Results
            $NextCode = $NextCode + 1               
        }

    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    相关资源
    最近更新 更多