PowerShell字符串数组通配符匹配:筛选排除指定前缀的回收站路径
PowerShell 过滤回收站路径解决方案
这里有两种实用的方法来实现你的需求,从指定的回收站路径数组中排除掉匹配给定前缀通配符的条目,不管排除列表有多少项都能适用:
方法1:使用正则表达式匹配前缀
这个方法适合排除项较多的场景,性能更高效:
$RecycleBinPaths = @('C:\$Recycle.Bin','D:\$RECYCLE.BIN','E:\$RECYCLE.BIN','F:\$RECYCLE.BIN','L:\$RECYCLE.BIN','M:\$RECYCLE.BIN','S:\$RECYCLE.BIN','T:\$RECYCLE.BIN') $ExcludeRecycleBinsPathWildCards = @('C:\','F:\') # 把排除前缀转换为正则匹配模式,确保只匹配字符串开头 $excludeRegex = '^(' + ($ExcludeRecycleBinsPathWildCards | ForEach-Object { [regex]::Escape($_) }) -join '|' + ')' # 筛选出不匹配前缀的路径 $filteredPaths = $RecycleBinPaths | Where-Object { $_ -notmatch $excludeRegex } # 输出结果 $filteredPaths
解释
[regex]::Escape($_):处理路径中的特殊字符(比如反斜杠\),避免破坏正则表达式结构- 拼接后的正则模式类似
^(C:\\|F:\\),表示匹配以C:\或F:\开头的字符串 -notmatch会保留所有不符合该模式的路径,正好符合你的需求
方法2:使用原生通配符-like(更易读)
如果你更喜欢直观的写法,用PowerShell自带的通配符匹配就足够了:
$RecycleBinPaths = @('C:\$Recycle.Bin','D:\$RECYCLE.BIN','E:\$RECYCLE.BIN','F:\$RECYCLE.BIN','L:\$RECYCLE.BIN','M:\$RECYCLE.BIN','S:\$RECYCLE.BIN','T:\$RECYCLE.BIN') $ExcludeRecycleBinsPathWildCards = @('C:\','F:\') # 遍历每个路径,检查是否不匹配任何排除前缀 $filteredPaths = $RecycleBinPaths | Where-Object { $currentPath = $_ # 如果没有任何排除前缀匹配当前路径,就保留它 -not ($ExcludeRecycleBinsPathWildCards | Where-Object { $currentPath -like "$_*" }) } # 输出结果 $filteredPaths
解释
"$_*":把每个排除前缀变成通配符模式,表示“以此前缀开头的任意字符串”-not (...):只有当当前路径不匹配所有排除项时,才会被保留下来
两种方法运行后都会输出你期望的结果:
D:$RECYCLE.BIN E:$RECYCLE.BIN L:$RECYCLE.BIN M:$RECYCLE.BIN S:$RECYCLE.BIN T:$RECYCLE.BIN
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

