10

I'm trying to figure out a way to get this command to filter from an array of values as opposed to one value. Currently this is how my code is (and it works when $ExcludeVerA is one value):

$ExcludeVerA = "7"

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

And I'd like $ExcludeVerA to have an array of values like so (this currently doesn't work):

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

foreach ($x in $ExcludeVerA)
{

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

}

Any ideas of why this second block of code doesn't work or other ideas of what I can do?

Tunaki
  • 132,869
  • 46
  • 340
  • 423
ThreePhase
  • 103
  • 1
  • 1
  • 4

2 Answers2

17

Try -notcontains

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

so if I understand it corretly, then

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

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

That was direct answer to your question. Possible solution might be something like this:

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

it uses regex to get job done.

stej
  • 28,745
  • 11
  • 71
  • 104
  • The first way doesn't work because the $_.version properties of these objects is typically a long number like: 7.01.04756 and I need to filter by only the first number (i.e. I need to search 7*). – ThreePhase May 07 '13 at 14:57
  • However, the second way you posted using regular expressions works beautifully! And it's simple and elegant. It's also introduced me to regular expressions, so thanks for that :) – ThreePhase May 07 '13 at 14:59
3

Try this:

Get-WmiObject -Class Win32_Product -Filter "Name LIKE '%Java%'" | 
Where-Object {$_.Version -notmatch '[734]'}
Shay Levy
  • 121,444
  • 32
  • 184
  • 206
  • Thing is, I need it to notmatch 7*, not just 7, as the version numbers tend to be long (but the stuff after the 7 doesn't matter. Using regular expressions as suggested in Stej's answer did the trick. Thanks, though. – ThreePhase May 07 '13 at 15:00