web-dev-qa-db-ja.com

Powershellの「where」コマンドを使用して値の配列と比較する

このコマンドで、1つの値ではなく、値の配列からフィルター処理する方法を見つけようとしています。現在、これは私のコードのようです(そして$ ExcludeVerAが1つの値であるときに機能します):

$ExcludeVerA = "7"

$Java = Get-WmiObject -Class win32_product | where { $_.Name -like "*Java*"} |
where ({ $_.Version -notlike "$ExcludeVerA*" })

そして、私は$ ExcludeVerAがそのような値の配列を持つことを望みます(これは現在動作しません):

$ExcludeVerA = "7", "3", "4"

foreach ($x in $ExcludeVerA)
{

$Java = Get-WmiObject -Class win32_product | where { $_.Name -like "*Java*"} |
where ({ $_.Version -notlike "$ExcludeVerA*" })

}

この2番目のコードブロックが機能しない理由や、私ができることについてのその他のアイデアはありますか?

10
ThreePhase

-notcontainsをお試しください

where ({ $ExcludeVerA -notcontains $_.Version })

だから私がそれを正しく理解すれば

$ExcludeVerA = "7", "3", "4"

$Java = Get-WmiObject -Class win32_product | where { $_.Name -like "*Java*"} |
where ({ $ExcludeVerA -notcontains $_.Version })

それはあなたの質問への直接の答えでした。可能な解決策は次のようなものです:

$ExcludeVerA = "^(7|3|4)\."
$Java = Get-WmiObject -Class win32_product | 
          where { $_.Name -like "*Java*"} |
          where { $_.Version -notmatch $ExcludeVerA}

それは仕事を成し遂げるために正規表現を使用します。

17
stej

これを試して:

Get-WmiObject -Class Win32_Product -Filter "Name LIKE '%Java%'" | 
Where-Object {$_.Version -notmatch '[734]'}
3
Shay Levy