2017-01-12 14 views
0

私はまだPowerShellをかなり新しくしています。PowerShell:テキストの一部が一致する場合、配列を別の[フィルタ]配列でフィルタリングします。

私はコードで動作していますが、間違ったにおいがします。 PowerShellの観点からこれを書く正しい方法は何ですか?

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

Write-Host "Filters" -ForegroundColor Yellow 
$filters 
Write-Host "Data" -ForegroundColor Yellow 
$data 

$results = @() 

foreach ($d in $data) 
{ 
    [bool] $skip = $false 
    foreach ($filter in $filters) 
    { 
     if ($d -like $filter) 
     { 
      $skip = $true 
     } 
    } 

    if ($skip -eq $false) 
    { 
     $results += $d 
    } 
} 

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

答えて

2

は、私もこの1が好きで、この

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

私はこのソリューションが好きです、gj! – Esperento57

+0

私はこの問題に必要なものを正確に示しました。きれいで読みやすい。 –

0

ここでの唯一の本当の問題は - あなたがに文字列と私はPowerShellが(私は間違っているかもしれない)エレガントに行うことができるとは思わない文字列の配列を比較する必要があるので、私はこれをやりました:

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

syntaxisは十分にクリーンであり、説明を必要としないと仮定します。説明が必要な場合は、コメントで教えてください。

1

正しい方法はありますか?私は正しい道があるとは知らない。私は正規表現使用してより良い方法を考える私はあなたを与えることができます。これは、基本的に$filters配列の各要素を取得

$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 

を、任意の特殊文字をエスケープすることで正規表現エスケープを行い、その後でそれらの結果のすべてを結合パイプ文字。したがって、$RegExFilterの例では、a|bとなります。次に、そのパターンに一致するものに対して$dataをフィルタリングします。あなたはこの

$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 
+0

を試してみてください。再利用可能な面は素晴らしいです。私は一見して読むのが簡単だからだけど、Select-Stringオプションを使う必要があります。間違いなくこのスニペットも保存します。 –

0

のように行うことができます

+0

これは私の期待した結果と一致しません。 1つの値( "a")だけをフィルタリングします。 –

+0

奇妙なことに私のPCで動作します。 PowerShellのバージョンは何ですか? – Esperento57