使用PowerShell中的“where”命令与值数组进行比较

10

我正试图找出一种方法,使此命令可以从值数组中过滤,而不是从单个值中进行过滤。当前我的代码是这样的(当$ExcludeVerA是一个值时它可以工作):

$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个回答

17

尝试使用-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}

它使用正则表达式完成任务。


第一种方式不起作用,因为这些对象的$_.version属性通常是一个长数字,例如7.01.04756,而我需要仅按第一个数字进行过滤(即我需要搜索7*)。 - ThreePhase
然而,你发布的第二种使用正则表达式的方法非常有效!而且它简单优雅。这也让我了解了正则表达式,所以谢谢你 :) - ThreePhase

3

试试这个:

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

事情是,我需要它不匹配7*,不仅仅是7,因为版本号往往很长(但是7之后的东西无关紧要)。使用 Stej 回答中建议的正则表达式解决了问题。谢谢。 - ThreePhase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接