PowerShell中使用-match匹配数组无结果的解决方法
解决PowerShell中数组匹配文件名无结果的问题
首先得点明你代码里的核心问题:PowerShell的-match运算符在右侧是数组时,只会尝试匹配数组的第一个元素,而不是检查数组中是否存在任意一个匹配项——这就是你没得到任何输出的原因。既然你不想额外套foreach循环,那咱们可以用这几种直接在if语句里生效的方法:
1. 精确匹配文件名(完全一致)
如果你的$ArrayofStringsThings里是完整的文件路径字符串,要判断当前文件的全名是否在数组里,直接用-in或者-contains就行,这俩都是PowerShell专门用来检查集合成员的运算符:
$Test = Get-ChildItem -Path "Some\Path" | Select-Object -Property FullName, Length, LastWriteTime foreach($File in $Test) { if($File.FullName -in $ArrayofStringsThings) { echo $File } }
或者反过来用-contains(效果完全一致):
if($ArrayofStringsThings -contains $File.FullName) { ... }
2. 匹配文件名包含数组中的任意子串
如果数组里是部分字符串(比如要找文件名包含"Report"或者"Log"的文件),可以用Where-Object结合-like,直接判断是否有匹配结果:
foreach($File in $Test) { # 检查是否有数组元素是文件名的子串 if($ArrayofStringsThings | Where-Object { $File.FullName -like "*$_*" }) { echo $File } }
更高效的写法是用PowerShell的Where方法(避免管道开销):
if($ArrayofStringsThings.Where({ $File.FullName -like "*$_*" }, 'First')) { ... }
'First'参数会在找到第一个匹配项后就停止,能提升大数组场景下的性能。
3. 正则表达式匹配(支持复杂模式)
如果你的数组里是正则表达式模式(比如要匹配.txt或.log结尾的文件),可以把数组里的模式用|连接成一个复合正则表达式,再用-match:
# 先把数组转成多模式正则 $regexPattern = $ArrayofStringsThings -join '|' foreach($File in $Test) { if($File.FullName -match $regexPattern) { echo $File } }
这样-match就会检查文件名是否匹配数组中的任意一个正则模式了。
额外提个小细节:如果你的$ArrayofStringsThings里有特殊字符(比如.或者*),用-like的时候要记得转义,或者直接用[regex]::Escape($_)处理,避免出现意外的匹配结果。
内容的提问来源于stack exchange,提问作者J0nsan
相关产品推荐
相关产品推荐

