将文件名与 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'
}
我正在寻找获取文件并测试其文件名是否包含数组中元素的最佳方法。
比如文件名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'
}