如何通过数组过滤PowerShell对象?替代foreach循环的优化方法
用数组批量过滤PowerShell权限对象
四处查找后,仅找到用单个值过滤数组的示例,未找到用数组过滤对象的方法。当前已实现功能但使用foreach循环显得繁琐,希望找到通过“不良用户”数组过滤权限对象的方法,尝试过-notcontains但无效,现有代码如下:
$permissions = dir -Recurse $path | where { $_.PsIsContainer } | ForEach-Object { $path1 = $_.fullname; Get-Acl $_.Fullname | ForEach-Object { $_.access }} $arrFilterDefaulsOut = @('NT AUTHORITY\\SYSTEM','BUILTIN\\Administrators','BUILTIN\\Users','CREATOR OWNER') foreach ($filter in $arrFilterDefaulsOut) { $permissions = $permissions | Select-Object * | Where-Object -property IdentityReference -ne $filter } $permissions | Select-Object *| Export-Csv $finalReport
优化方案
你之前用-notcontains无效的核心原因是:IdentityReference是对象类型而非纯字符串,直接对比会不匹配;另外-notcontains的语法要求数组在前,待判断的值在后,反过来写逻辑会出错。
直接用数组一次性完成过滤,无需循环,优化后的代码如下:
$path = "你的目标目录路径" $finalReport = "结果CSV文件路径" # 获取所有子目录的ACL权限,并添加目录路径属性(方便后续溯源) $permissions = Get-ChildItem -Recurse $path -Directory | ForEach-Object { $dirFullPath = $_.FullName (Get-Acl $dirFullPath).Access | Add-Member -NotePropertyName "DirectoryPath" -NotePropertyValue $dirFullPath -PassThru } # 定义需要排除的系统用户/组 $excludeIdentities = @('NT AUTHORITY\SYSTEM','BUILTIN\Administrators','BUILTIN\Users','CREATOR OWNER') # 一次性过滤掉不需要的权限条目 $filteredPermissions = $permissions | Where-Object { $excludeIdentities -notcontains $_.IdentityReference.Value } # 导出到CSV(-NoTypeInformation避免添加多余的类型信息行) $filteredPermissions | Export-Csv $finalReport -NoTypeInformation
额外优化点
- 用
Get-ChildItem -Directory替代dir | Where-Object { $_.PsIsContainer },更符合PowerShell最佳实践,执行效率更高 - 给权限对象添加
DirectoryPath属性,导出的CSV会显示每条权限所属的目录,结果更实用 - 避免了多次管道过滤的性能损耗,一次性完成筛选逻辑,代码更简洁
内容的提问来源于stack exchange,提问作者casewolf
相关产品推荐
相关产品推荐

