2013-05-07 68 views
9

我試圖找出一種方法來獲取此命令從一個值的數組,而不是一個值過濾。目前,這是我的代碼是如何(和它的作品時$ ExcludeVerA是一個值):使用Powershell「where」命令與值數組進行比較

$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*" }) 

} 

任何想法,爲什麼這第二塊代碼不起作用或我可以做什麼的其他想法?

回答

14

嘗試-notcontains

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

所以如果我corretly理解它,然後

$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} 

它使用正則表達式來完成工作。

+0

第一種方法行不通,因爲$ _這些對象的版本屬性通常是像長號:7.01.04756,我需要通過僅第一個數字過濾(即我需要搜索7 *)。 – ThreePhase 2013-05-07 14:57:59

+0

但是,使用正則表達式發佈的第二種方式效果非常好!它簡單而優雅。它也向我介紹正則表達式,所以謝謝:) – ThreePhase 2013-05-07 14:59:02

2

試試這個:

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

事情是,我需要它不匹配7 *,而不僅僅是7,因爲版本號往往很長(但7之後的東西並不重要。使用正則表達式在Stej的答案中提出了這個竅門,不過謝謝。 – ThreePhase 2013-05-07 15:00:49