PowerShell数组过滤:保留同用户下最长前缀匹配项
PowerShell数组过滤:按用户保留最长前缀路径项
解决方案代码
# 按用户分组筛选最长路径项 $result = $data | Group-Object By | ForEach-Object { $userFiles = $_.Group.File $_.Group | Where-Object { $currentPath = $_.File # 排除存在更长同前缀路径的项 -not ($userFiles | Where-Object { $_ -ne $currentPath -and $_.StartsWith($currentPath) }) } } # 格式化输出结果 $result | Format-Table By, Mode, File -AutoSize
逻辑说明
- 按用户分组:用
Group-Object By将数据按By列分组,确保仅在同一用户的范围内处理路径关系,不同用户的项互不影响。 - 筛选最长路径:
- 对每个用户组,先提取所有
File路径到$userFiles变量。 - 遍历组内每一项,检查当前路径是否是其他路径的前缀:如果存在不等于当前路径且以当前路径开头的项,说明当前路径是短前缀项,需要排除;反之则保留(即当前路径是最长的,没有更长的路径以它为前缀)。
- 对每个用户组,先提取所有
针对示例数据的验证结果
- user1组:
creation\1. ABC是另外两个路径的前缀,被排除,保留creation\1. ABC\Invoice和creation\1. ABC\LIMITED。 - user2组:
edition\File是edition\File\DATA SHEETS的前缀,BCD是BCD\DATA的前缀,这两个短项被排除,保留两个最长路径。 - user3组:仅有一个项,直接保留。
原有代码问题分析
你之前的循环仅遍历$data.file,没有按用户分组,且用Contains判断的是包含关系(而非前缀关系),逻辑上无法区分前缀层级和用户边界,所以达不到需求。
内容的提问来源于stack exchange,提问作者Cora_beeetle
相关产品推荐
相关产品推荐

