我必须找到超过3个CSV的匹配项。这是为了确定用户在Exchange 2016中是否具有PublicFolders上的AccessRights。为了易于使用,我已经搜索了所有必需的值并将其存储在3个CSV中
“ 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
}
}
是否可以加快处理速度?可能通过使用正则表达式。
我找不到任何允许在多个数组之间进行扩展匹配的示例。
答案 0 :(得分:0)
正如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
}
}