如何在Powershell中使用字符串列表过滤列表

时间:2018-09-03 15:02:44

标签: powershell

我有一个对象列表,想要过滤名称类似于列表中的字符串之一的所有元素。 我目前的方法是使用.htaccess,但这会导致对where-object的调用很长。

where-object

我希望减少此处所需的样板,因为我希望字符串列表会很大。
我还希望能够在另一个输出上使用过滤器,这似乎只能通过复制粘贴where-object块来实现。

2 个答案:

答案 0 :(得分:2)

您可以改用正则表达式notmatch。这将更快地执行。 像

Get-AppxPackage | Where-Object {$_.name -notmatch 'store|MSPaint'} 

您可以输入数组或通过读取文本文件来构建模式,而不是键入不匹配的文字名称。 假设您在文本文件中有一个名称列表

store
MSPaint
...

然后您可以使用

作为数组读取此文件。
$list = Get-Content -Path "<PATH TO THE FILE>"

下一步,结合此列表以构建类似的模式

$pattern = (($list | ForEach-Object {[regex]::Escape($_)}) –join "|")

然后做

Get-AppxPackage | Where-Object {$_.name -notmatch $pattern} 

希望这会有所帮助

答案 1 :(得分:0)

这段代码展示了如何在 where-object 中使用 -and 和 -or 进行过滤

class cCustomField
{
[string] $Id
[string] $Name
[string] $Description
[string] $Type
[bool] $On_projects
[bool] $On_people
} 
$list = New-Object Collections.Generic.List[cCustomField]
 ... load your data ....
 filter using -and -or 
$my_object=$list | Where-Object {$_.name -EQ 'gender' -and $_.on_people -EQ $true  }