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

Fly*_*FoX 4 powershell

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

Get-AppxPackage |
    where-object {$_.name -notlike "*store*"} |
    where-object {$_.name -notlike "*MSPaint*"} ...
Run Code Online (Sandbox Code Playgroud)

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

The*_*heo 9

您可以使用正则表达式notmatch代替。这执行起来会快很多。\n类似

\n\n
Get-AppxPackage | Where-Object {$_.name -notmatch \'store|MSPaint\'} \n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
store\nMSPaint\n...\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后您可以将此文件作为数组读取

\n\n
$list = Get-Content -Path "<PATH TO THE FILE>"\n
Run Code Online (Sandbox Code Playgroud)\n\n

接下来结合这个列表来构建如下模式

\n\n
$pattern = (($list | ForEach-Object {[regex]::Escape($_)}) \xe2\x80\x93join "|")\n
Run Code Online (Sandbox Code Playgroud)\n\n

并做

\n\n
Get-AppxPackage | Where-Object {$_.name -notmatch $pattern} \n
Run Code Online (Sandbox Code Playgroud)\n\n

希望这可以帮助

\n