如何在PowerShell的循环中使用两个条件筛选目标目录?
PowerShell多规则前缀筛选目录实现方法
你原有代码无法生效的核心原因有3个:
- 运算符误用:PowerShell中
-Contains是集合元素判断运算符,用来检查单个值是否存在于数组/列表类集合中,不支持字符串前缀/内容匹配。字符串前缀匹配需要用-StartsWith()方法,或者-Like运算符配合通配符。 - 语法错误:
Where-Object的脚本块只需要返回布尔类型的判断结果,不需要嵌套if语句,且你写的if {判断条件}本身语法不符合PowerShell规则(if后接判断条件需要用圆括号包裹)。 - 参数限制:
Get-ChildItem的-Filter参数单次仅支持传入1个匹配规则,无法直接同时匹配两类前缀。
推荐实现方案
所有方案默认添加-Directory参数,仅筛选子目录、避免误匹配同名普通文件,如果需要同时选中同前缀文件删掉该参数即可。
方案1:前缀精确匹配(性能最优)
直接调用字符串的StartsWith方法做前缀判断,逻辑最明确、执行效率最高:
foreach ($f in Get-ChildItem -Directory | Where-Object { $_.Name.StartsWith("abc") -or $_.Name.StartsWith("alphabet") }) { # 在此处编写需要对目标目录执行的操作,通过$f引用当前目录对象 # 示例:输出当前处理的目录全路径 Write-Host "处理目录:$($f.FullName)" }
方案2:通配符匹配写法
如果你更习惯用通配符规则,使用-Like运算符搭配*通配符即可实现和上述代码完全一致的效果:
foreach ($f in Get-ChildItem -Directory | Where-Object { $_.Name -Like "abc*" -or $_.Name -Like "alphabet*" }) { # 你的业务逻辑 }
方案3:直接用-Include传入多筛选规则
Get-ChildItem的-Include参数支持传入数组格式的多个匹配规则,注意非递归场景下需要给-Path参数值末尾加*才能让筛选规则生效:
foreach ($f in Get-ChildItem -Path .\* -Directory -Include "abc*", "alphabet*") { # 你的业务逻辑 }
注意:如果需要做不区分大小写的匹配,可以把上述运算符/方法换成大小写不敏感的版本:比如
-iStartsWith、-iLike,PowerShell默认的匹配行为本来就是大小写不敏感,绝大多数场景不需要额外调整。
内容的提问来源于stack exchange,提问作者mandypea
相关产品推荐
相关产品推荐

