PowerShell:如果文本的任何部分匹配,则通过另一个[filter]数组过滤数组。

时间:2017-01-12 17:10:26

标签: powershell

好的,我对PowerShell还不太新鲜。

我已经写了一段的代码,但它闻起来完全错了。从PowerShell的角度来看,写这个的正确方法是什么?

$(".tr_clone_add").on('click', function() {        
    $('.tr_clone').clone(false).removeClass("tr_clone").appendTo('table tbody'); 
});

5 个答案:

答案 0 :(得分:2)

你可以这样做

$filters = @("a","b")
$data = @("c/a","c/b","c/a/d","e","a","e/f")
$desiredResults = @("e","e/f")

$data | Select-String -Pattern $filters -NotMatch

答案 1 :(得分:1)

正确的方法?我不知道有正确的方法。我可以使用RegEx为您提供更好的方法:

$filters = @("a","b")
$data = @("c/a","c/b","c/a/d","e","a","e/f")
$desiredResults = @("e","e/f")

$RegExFilter = ($Filters|%{[regex]::escape($_)}) -join '|'

$Results = $data | Where{$_ -notmatch $RegExFilter}

Write-Host "Desired Results" -ForegroundColor Yellow
$desiredResults
Write-Host "Results" -ForegroundColor Yellow
$results

这基本上采用$filters数组的每个元素,对其执行正则表达式转义以转义任何特殊字符,然后将所有这些结果与管道字符连接起来。因此,在给定$RegExFilter等于a|b的示例中。然后它会针对与该模式匹配的任何内容过滤$data

答案 2 :(得分:0)

这里唯一真正的问题 - 你必须比较字符串和字符串数组,我不认为powershell可以做得很优雅(但我可能错了),所以我做到了这一点:

foreach ($d in $data)
{
    if ($d -notlike $filters[0] -and $d -notlike $filters[1])
    {
        $results += $d
    }
}

我认为语法足够干净,不需要任何解释。如果需要解释,请在评论中告诉我。

答案 3 :(得分:0)

试试这个

$data | %{$val=$_; $Nb=($filters | where {$val -like $_}).Count ; if ($Nb -eq 0) {$val} }

答案 4 :(得分:0)

我经常遇到双管道问题,所以我将其中一个切换到 ForEach。
这是一个单线。

$filters = @("*a*","*b*")
$data = @("c/a","c/b","c/a/d","e","a","e/f")

ForEach ($Item in $data) { If ( !($filters | Where-Object {$Item -like $_})) { $Item } }