Powershell - 对阵阵列

Neo*_*isk 5 arrays powershell sql-like

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

$excludeFiles = @"
aaa.bbb
ccccc.*
ddddd???.exe
"@ | SplitAndTrim;
Run Code Online (Sandbox Code Playgroud)

如果文件与任何行匹配,它应该排除处理文件.试图避免match/regex,因为这个脚本需要由不了解它的人修改,并且有几个地方需要实现它.

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

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

"ddddd000.exe" -like @("aaa.bbb", "ccccc.*", "ddddd???.exe")
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*evy 7

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

foreach($pattern in $excludeFiles)
{
    if($fileName -like $pattern) {break}
}
Run Code Online (Sandbox Code Playgroud)

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

function like($str,$patterns){
    foreach($pattern in $patterns) { if($str -like $pattern) { return $true; } }
    return $false;
}
Run Code Online (Sandbox Code Playgroud)

  • 将它包装在一个函数中并重用它:) (2认同)

dav*_*igh 7

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

($your_array | %{"your_string" -like $_}) -contains $true
Run Code Online (Sandbox Code Playgroud)

适用于OP中的案例获得

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