Поиск PowerShell соответствует более чем 3 CSV ... медленное выполнение - PullRequest
0 голосов
/ 23 февраля 2019

Я должен найти совпадения более 3 CSV.Он должен выяснить, есть ли у пользователей AccessRights в PublicFolders в Exchange 2016. Для простоты использования я уже искал и сохранил все необходимые значения в 3 файлах CSV

  1. "PF-Folder_Full.csv": aсписок всех папок Publich (более 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
    }
}

Есть ли способ ускорить процесс?Возможно, с помощью регулярных выражений.

Я не смог найти ни одного примера, который бы позволял расширять совпадения между несколькими массивами.

1 Ответ

0 голосов
/ 23 февраля 2019

Как отметил в комментариях Кори Гилл: создайте две хеш-таблицы из свойств Identity и DisplayName из первых двух 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
        }
    }
...