PowerShell搜索匹配超过3个CSV ...执行缓慢

问题描述 投票:1回答:1

我必须找到超过3个CSV的匹配项。这是为了确定用户是否在Exchange 2016中的PublicFolders上具有AccessRights。为了便于使用,我已经搜索并存储了3个CSV中的所有需要​​值

  1. “PF-Folder_Full.csv”:所有公共文件夹的列表(超过5000)
  2. “PF-Mailboxes.csv”:所有用户的列表(大约50个)
  3. “PF-Permissions.csv”:结果 Get-PublicFolderClientPermission -Identity $Folder.Identity 循环遍历所有公共文件夹(需要很长时间)

我编写了一个可以完成这项工作的脚本,但即使在快速的计算机上,它也非常慢,因为它已遍历所有公共文件夹并通过所有用户,然后在权限中找到两个值的匹配项

$Folders     = Import-Csv -Path ".\PF-Folder_Full.csv" -Encoding Unicode
$Mailboxes   = Import-Csv -Path ".\PF-Mailboxes.csv" -Encoding Unicode
$Permissions = Import-Csv -Path ".\PF-Permissions.csv" -Encoding Unicode

foreach ($Folder in $Folders) {
    foreach ($Mailbox in $Mailboxes) {
        $Permission = $Permissions | where {
            ($_.Identity -eq $Folder.Identity) -and
            ($_.User -eq $Mailbox.DisplayName)
        }

        if ($Permission) { 
            # some code
        } else {
            # some other code
        }

        Remove-Variable Permission
    }
}

有没有办法加快速度?可能通过使用正则表达式。

我找不到任何允许多个数组之间扩展匹配的示例。

arrays regex powershell powershell-v4.0
1个回答
0
投票

正如Kory Gill在评论中提到的:从前两个CSV中的IdentityDisplayName属性构建两个哈希表:

$Folders = @{}
Import-Csv -Path ".\PF-Folder_Full.csv" -Encoding Unicode | ForEach-Object {
    $Folders[$_.Identity] = $_
}

$Mailboxes = @{}
Import-Csv -Path ".\PF-Mailboxes.csv" -Encoding Unicode | ForEach-Object {
    $Mailboxes[$_.DisplayName] = $_
}

然后使用这些哈希表处理第三个CSV以进行查找:

$Permissions = Import-Csv -Path ".\PF-Permissions.csv" -Encoding Unicode
foreach ($p in $Permissions) {
    if ($Folders.Contains($p.Identity) -and $Mailboxes.Contains($p.User)) {
        # some code
    } else {
        # some other code
    }
}

如果您希望代码每个唯一身份/用户组合运行一次,您可以构建一个哈希表,其中包含用于过滤的组合标识和邮箱名称:

$Folders   = Import-Csv -Path ".\PF-Folder_Full.csv" -Encoding Unicode |
             Select-Object -Expand Identity
$Mailboxes = Import-Csv -Path ".\PF-Mailboxes.csv" -Encoding Unicode |
             Select-Object -Expand DisplayName

$fltr = @{}
foreach ($f in $Folders) {
    foreach ($m in $Mailboxes) {
        $fltr["$f $m"] = $true
    }
}

然后对第三个CSV中的记录进行分组:

Import-Csv -Path ".\PF-Permissions.csv" -Encoding Unicode |
    Group-Object Identity, User |
    ForEach-Object {
        if ($fltr.Contains($_.Name)) {
            # some code
        } else {
            # some other code
        }
    }
© www.soinside.com 2019 - 2024. All rights reserved.