【问题标题】:powershell Get-ChildItem given multiple -Filterspowershell Get-ChildItem 给定多个 -Filters
【发布时间】:2015-05-10 11:38:17
【问题描述】:

Get-ChildItem 的 -Filter 属性是否有语法允许您同时应用多个过滤器?即类似于下面的内容,我想在两者中都使用通配符来找到一些不同但具体的命名 .dll?

Get-ChildItem -Path $myPath -Filter "MyProject.Data*.dll", "EntityFramework*.dll"

或者我是否需要将其拆分为多个 Get-ChildItem 调用?因为我正在寻找管道的结果。

【问题讨论】:

    标签: powershell


    【解决方案1】:

    Get-ChildItem 中的 -Filter 参数仅支持单个字符串/条件 AFAIK。这里有两种方法可以解决您的问题:

    您可以使用接受多个字符串进行匹配的-Include 参数。这比 -Filter 慢,因为它在 cmdlet 中进行搜索,而 -Filter 在提供级别上完成(在 cmdlet 获取结果之前它可以处理它们)。但是,它很容易编写和工作。

    #You have to specify a path to make -Include available, use .\* 
    Get-ChildItem .\* -Include "MyProject.Data*.dll", "EntityFramework*.dll"
    

    您还可以使用-Filter 获取所有 DLL,然后在 where 语句中过滤掉您想要的那些。

    Get-ChildItem -Filter "*.dll" .\* | Where-Object { $_.Name -match '^MyProject.Data.*|^EntityFramework.*' }
    

    【讨论】:

    • 我认为值得一提的是,-Include 只有在与 -Recurse 一起使用时才能成功,就像您在示例中所做的那样。
    • @FrodeF。我错过了,因为它没有粗体、下划线、斜体,并且有一个闪烁的标志,上面写着实时代码。
    • 如何找到同时包含 MyProject.Data*.dll 和 EntityFramework*.dll 的文件夹?
    • 尝试(未经测试):Get-ChildItem -Filter "*.dll" -Recurse | Group-Object DirectoryName | Where-Object { ($_.Group.Name -match '^MyProject\.Data\.') -and ($_.Group.Name -match '^EntityFramework\.') } | Select-Object -ExpandProperty Name
    • 您可以在不使用-Recurse 的情况下使用-Include,但是您需要将\* 添加到文件夹中。 Get-ChildItem folder\* -Include *.xml,*.json
    【解决方案2】:

    您可以像这样将过滤结果加入管道中:

    @("MyProject.Data*.dll", "EntityFramework*.dll") | %{ Get-ChildItem -File $myPath -Filter $_ }
    

    【讨论】:

    • @NicoNekoru 为什么一个老问题和老答案会让它不适合回答?如果有的话,应该鼓励旧问题的新答案,因为技术在不断发展,并且不断实施新的更有效的方法来实现相同的结果。
    • @stackexchange_account1111 这个问题没有带来任何新的东西,甚至正如stackoverflow.com/a/30151327/12671858 所指出的那样,是-Include 的一个更糟糕的替代方案。答案本身很好,但是复制其他答案并提供比当前接受的解决方案效率低的解决方案是没有意义的。正如this meta post 中所讨论的那样,这样的答案是不必要的。
    • 等一下,它是好的还是重复的?因为两者是互斥的(除非同时发布)。更重要的是,这个特定的效率是否较低是无关紧要的。您给出了一个规定性声明,即不应回答带有旧答案的旧问题,这在技术方面是一种令人难以置信的适得其反的思维方式。
    【解决方案3】:

    -Filter 只能使用一个值,而-Include 可以接受多个值,例如“.dll, *.exe”。

    【讨论】:

      【解决方案4】:

      您可以同时使用-Filter 和-Include

      Get-ChildItem -Path $myPath -Filter "*.dll" -Include "MyProject.Data*.dll", "EntityFramework*.dll"

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-06-06
        • 2011-02-22
        • 1970-01-01
        • 1970-01-01
        • 2019-02-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多