arrays - PowerShell 搜索匹配超过 3 个 CSV... 执行缓慢
问题描述
我必须找到超过 3 个 CSV 的匹配项。这是为了找出用户是否在 Exchange 2016 中的 PublicFolders 上拥有 AccessRights。为了便于使用,我已经在 3 个 CSV 中搜索并存储了所有需要的值
- “PF-Folder_Full.csv”:所有 Publich 文件夹的列表(超过 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 的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
}
}
推荐阅读
- r - dplyr 列联表中的准确比例
- python - Scipy sigmoid 曲线拟合
- c++ - C ++单例继承问题
- drupal - 将旧网站的数据导入具有不同架构的新 drupal 网站
- flutter - 如何使用 Flutter 创建 _showMenu 函数,该函数动态构建弹出菜单并允许处理选定的选项
- wordpress - 如何在WordPress的静态页面中按类别显示帖子
- node.js - 离子文件传输太大?
- pandas - Pandas Group By + Cumsum 分类变量
- reactjs - 如何访问 React 组件中嵌套的 Redux 状态?
- r - gmm_rolling 估计中方差膨胀因子的错误