- 包含或匹配多个值

时间:2017-09-27 12:20:19

标签: powershell powershell-v3.0

我必须按特定字符串过滤我的搜索结果,并尝试使用-match-contains进行搜索。

-match如果我只有一个要过滤的值,但没有数组,则可以正常工作 -contains既不适用于一个字符串,也不适用于字符串数组

为什么它没有使用多个值?特别是-contains。 或者还有另一种简单的解决方法吗?

$Folder = 'C:\Test'

$filterArray =  @('2017-05', '2017-08')
$filter =  '2017-05'

## test with -MATCH

## working with one match string
Get-ChildItem -Path $Folder -Recurse -Include *.txt |
    Where { $_.FullName -match $filter } |
    ForEach-Object { $_.FullName }
## NOT working with match string array - no results
Get-ChildItem -Path $Folder -Recurse -Include *.txt |
    Where { $_.FullName -match $filterArray } |
    ForEach-Object { $_.FullName }

## test with -CONTAINS
## NOT working with one contains string - no results
Get-ChildItem -Path $Folder -Recurse -Include *.txt |
    Where { $_.FullName -contains $filter } |
    ForEach-Object { $_.FullName }
## NOT working with contains string array- no results
Get-ChildItem -Path $Folder -Recurse -Include *.txt |
    Where { $_.FullName -contains $filterArray } |
    ForEach-Object { $_.FullName }

2 个答案:

答案 0 :(得分:2)

  

为什么不使用多个值?

因为这些运算符被设计为针对单个参数进行测试,简单明了。

在单个操作中匹配多个参数的能力会产生一个问题:“输入是否需要满足所有或任何参数条件”?

如果要测试与任何正则表达式模式的匹配,可以使用非捕获组从它们构造单个模式,如下所示:

ref.orderByChild('timestamp').startAt(Date.now()).on('child_added',function(snapshot) {
  console.log('new record', snapshot.val());
});

您也可以完全删除$filterPattern = '(?:{0})' -f ($filterArray -join '|') Get-ChildItem -Path $Folder -Recurse -Include *.txt | Where {$_.FullName -match $filterPattern} |ForEach-Object{ $_.FullName } Where-Object循环,因为PowerShell 3.0支持属性枚举:

ForEach-Object

答案 1 :(得分:2)

使用数组作为-match-contains运算符的第二个操作数不起作用。您基本上可以采取两种方法:

  • 从数组构建正则表达式,并将其与-match运算符一起使用:

    $pattern = @($filterArray | ForEach-Object {[regex]::Escape($_)}) -join '|'
    ... | Where-Object { $_.FullName -match $pattern }
    

    这是首选方法。

  • 使用嵌套的Where-Object过滤器和String.Contains()方法:

    ... | Where-Object {
        $f = $_.FullName
        $filterArray | Where-Object { $f.Contains($_) }
    }