Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays PowerShell搜索超过3个CSV的匹配项。。。执行缓慢_Arrays_Regex_Powershell_Powershell 4.0 - Fatal编程技术网

Arrays PowerShell搜索超过3个CSV的匹配项。。。执行缓慢

Arrays PowerShell搜索超过3个CSV的匹配项。。。执行缓慢,arrays,regex,powershell,powershell-4.0,Arrays,Regex,Powershell,Powershell 4.0,我必须找到超过3个CSV的匹配项。这是为了了解用户是否拥有Exchange 2016中PublicFolders的访问权限。为了便于使用,我已经在3个CSV中搜索并存储了所有需要的值 “PF-Folder_Full.csv”:所有公共文件夹的列表(超过5000个) “PF Mailboxes.csv”:所有用户的列表(大约50个) “PF Permissions.csv”:操作的结果 Get-PublicFolderClientPermission -Identity $Folder.Ident

我必须找到超过3个CSV的匹配项。这是为了了解用户是否拥有Exchange 2016中PublicFolders的访问权限。为了便于使用,我已经在3个CSV中搜索并存储了所有需要的值

  • “PF-Folder_Full.csv”:所有公共文件夹的列表(超过5000个)
  • “PF Mailboxes.csv”:所有用户的列表(大约50个)
  • “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
        }
    }
    
    有没有办法加快速度?可能是通过使用正则表达式


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

    正如Kory Gill在评论中提到的那样:从前两个CSV的
    标识和
    显示名称属性构建两个哈希表:

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

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

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

    每个csv中有多少个条目?可以将它们存储在哈希表/字典中,以便更快地查找。循环中不需要删除变量,但这不是性能问题。每个csv中有多少个条目?可以将它们存储在哈希表/字典中,以便更快地查找。在循环中不需要删除变量,但这不是性能问题。您好,Ansgar,您的第一个替代方案可以完美且快速地工作。它在几分钟内完成了almot 120.000次迭代。另一个让我困惑。我想我理解了第一部分。但第二件事我没想到。我还假设“$.\u Name”实际上应该是“$.\u DisplayName”,因为我的表中没有“.Name”表CSVs@AlexanderPoettinger查看
    组对象标识,User
    的输出(在该步骤后移除管道的其余部分以显示),所有内容都应该变得清晰。你好,Ansgar,您的第一个备选方案运行完美且速度非常快。它在几分钟内完成了almot 120.000次迭代。另一个让我困惑。我想我理解了第一部分。但第二件事我没想到。我还假设“$.\u Name”实际上应该是“$.\u DisplayName”,因为我的表中没有“.Name”表CSVs@AlexanderPoettinger查看
    组对象标识,User
    的输出(在该步骤之后移除管道的其余部分以使其显示),所有内容都应该变得清晰。