将文件名与 Powershell 中的文件掩码数组进行比较

Comparing file names to an array of file masks in Powershell

我正在寻找获取文件并测试其文件名是否包含数组中元素的最佳方法。

比如文件名AB_011_Test.txt,列表@("010", "011", "012"),我需要测试一下文件名是否包含列表的其中一个元素。显然在这个例子中它会 return 为真,但是文件 XZ_999_Test.txt 会 return 为假。

TIA!

您可以 join 使用 | 的所有数组元素来创建可以匹配 任一 元素的模式,并将其与 -match operator 运算符.

PS > "AB_011_Test.txt" -match (@("010", "011", "012") -Join "|")
True
PS > "XZ_999_Test.txt" -match (@("010", "011", "012") -Join "|")
False

这是使用内部 Where 方法的另一种方法:

$list = "010", "011", "012"

$fileName = "AB_011_Test.txt"
$list.Where({ $fileName.Contains($_) }, 'First').Count -gt 0
# -> outputs: True

$fileName = "XZ_999_Test.txt"
$list.Where({ $fileName.Contains($_) }, 'First').Count -gt 0
# -> outputs: False

Where方法的第一个参数是一个脚本块,用于过滤数组元素(或其他enumerable类型),类似于Where-Object 命令。第二个可选参数定义选择模式。我们传递 First 是因为我们只需要找到第一个匹配元素就可以产生 True 输出。

最后我们检查筛选集合的 Count 成员以确定是否有任何匹配项。

请注意,当使用 if 语句时,您不需要显式检查 Count 成员,因为 non-empty 集合计算为 $true:

if( $list.Where({ $fileName.Contains($_) }, 'First') ) {
   Write-Host 'Match'
} else {
   Write-Host 'No match'
}