8

对于每个正在处理的文件,都会检查其名称是否满足条件。例如,给定以下过滤器列表:

$excludeFiles = @"
aaa.bbb
ccccc.*
ddddd???.exe
"@ | SplitAndTrim;

如果文件与任何行匹配,它应该从处理中排除文件。尽量避免match/regex,因为这个脚本需要被不知道它的人修改,并且有几个地方需要实现它。

$excludedFiles和类似的被故意定义为here-string。它允许最终用户/操作员直接从 CMD/Powershell 窗口粘贴一堆文件名。

看来Powershell不接受-like数组,所以我不能这样写:

"ddddd000.exe" -like @("aaa.bbb", "ccccc.*", "ddddd???.exe")

我错过了一个选项吗?如果 Powershell 本身不支持它,那么实现它的最简单方法是什么?

4

4 回答 4

13

这是已接受答案中模式的简短版本:

($your_array | %{"your_string" -like $_}) -contains $true

应用于OP中的案例获得

PS C:\> ("aaa.bbb", "ccccc.*", "ddddd???.exe" | %{"ddddd000.exe" -like $_}) -contains $true
True
于 2016-08-12T10:59:50.370 回答
7

您可以针对名称集合执行模式匹配,但不能针对模式列表执行模式匹配。尝试这个:

foreach($pattern in $excludeFiles)
{
    if($fileName -like $pattern) {break}
}

以下是如何将其包装到函数中:

function like($str,$patterns){
    foreach($pattern in $patterns) { if($str -like $pattern) { return $true; } }
    return $false;
}
于 2012-10-22T20:56:25.230 回答
3

我想你可以使用Get-ChildItem -Exclude参数:

Get-ChildItem $theFileToCheck -exclude $excludeFiles

如果您有要检查的文件数组,则Get-ChildItem接受路径数组:

Get-ChildItem $filesToCheck -exclude $excludeFiles
于 2012-10-22T22:38:08.143 回答
0

$excludeFiles.Where{$stringToTest -like $_}

Powershell 数组有一个 Where 方法可以接受表达式输入,因此使用 {} 而不是 ()。输入一个字符串进行测试,它将使用标准管道遍历数组,因此 $_ 表示数组的元素。

输出匹配元素的列表。

PS H:\> $excludeFiles = @("aaa.bbb", "ccccc.*", "ddddd???.exe")
PS H:\> $stringToTest = "ddddd000.exe"
PS H:\> $excludeFiles.Where{$stringToTest -like $_}
ddddd???.exe
于 2019-10-04T18:23:43.560 回答