You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过数组过滤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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.17 18:07:13