代码之家  ›  专栏  ›  技术社区  ›  FlyingFoX Stephen Cleary

如何在PowerShell中使用字符串列表筛选列表

  •  0
  • FlyingFoX Stephen Cleary  · 技术社区  · 6 年前

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

    Get-AppxPackage |
        where-object {$_.name -notlike "*store*"} |
        where-object {$_.name -notlike "*MSPaint*"} ...
    

    我想减少这里需要的样板文件,因为我希望字符串列表变得相当大。
    我还希望能够在另一个输出上使用过滤器,这似乎我目前只能通过复制粘贴where对象块来完成。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Theo    6 年前

    你可以用regex 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} 
    

    希望这有帮助