使用 Powershell“where”命令与值数组进行比较

Posted

技术标签:

【中文标题】使用 Powershell“where”命令与值数组进行比较【英文标题】:Using Powershell "where" command to compare against Array of values 【发布时间】:2013-05-01 11:20:24 【问题描述】:

我试图找出一种方法来让这个命令从一组值而不是一个值中过滤。目前我的代码是这样的(当 $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*" )


关于为什么第二个代码块不起作用的任何想法或关于我可以做什么的其他想法?

【问题讨论】:

【参考方案1】:

试试-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*)。 但是,您使用正则表达式发布的第二种方式效果很好!它简单而优雅。它还向我介绍了正则表达式,非常感谢 :)【参考方案2】:

试试这个:

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

【讨论】:

问题是,我需要它不匹配 7*,而不仅仅是 7,因为版本号往往很长(但 7 之后的东西并不重要。使用 Stej 中建议的正则表达式答案成功了。不过,谢谢。

以上是关于使用 Powershell“where”命令与值数组进行比较的主要内容,如果未能解决你的问题,请参考以下文章

Powershell 使用 WHERE 子句插入 MS Access

有没有办法在powershell中切换用户以运行没有密码提示的命令?

如何编写 PowerShell 函数来获取目录?

Powershell where子句过滤

PowerShell 管道符之Where-Object的使用方法

如何像 IN 语句一样使用 Powershell Where-Object