Arrays PowerShell搜索超过3个CSV的匹配项。。。执行缓慢
我必须找到超过3个CSV的匹配项。这是为了了解用户是否拥有Exchange 2016中PublicFolders的访问权限。为了便于使用,我已经在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
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
的输出(在该步骤之后移除管道的其余部分以使其显示),所有内容都应该变得清晰。