Powershell - 对阵阵列

时间:2012-10-22 20:22:01

标签: arrays powershell sql-like

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

$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 个答案:

答案 0 :(得分:6)

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

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;
}

答案 1 :(得分:6)

以下是接受答案中模式的简短版本:

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

应用于OP中的案例获得

PS C:\> ("aaa.bbb", "ccccc.*", "ddddd???.exe" | %{"ddddd000.exe" -like $_}) -contains $true
True

答案 2 :(得分:1)

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

Get-ChildItem $theFileToCheck -exclude $excludeFiles

如果要检查的文件数组,Get-ChildItem接受一系列路径:

Get-ChildItem $filesToCheck -exclude $excludeFiles

答案 3 :(得分: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