【问题标题】:How to find files in directories with certain name using Get-ChildItem?如何使用 Get-ChildItem 在具有特定名称的目录中查找文件?
【发布时间】:2012-04-17 05:04:36
【问题描述】:

我有一个名为 topfolder 的项目文件夹,我想在所有子文件夹中查找与特定模式匹配的所有文件,例如当文件夹在其名称中的任何位置包含foo 时,我想列出其中的所有文件。

我尝试了类似的方法:

gci .\topfolder -rec -filter *foo*

但它有两个问题:

  1. 只会列出实际包含 foo 的文件(我想要 any 类 foo 文件夹中的文件)。
  2. 与此过滤器匹配的目录也将成为结果集的一部分。

然后我尝试了这个:

gci .\topfolder\*foo* -include *.*

但这根本不起作用 - 显然通配符只匹配路径的一个片段,因此该模式将匹配 topfolder\foobar 而不是 topfolder\subfolder\foobar。

到目前为止,我发现的唯一方法是两次使用 Get-ChildItem,如下所示:

gci .\topfolder -rec -include *foo* | where { $_.psiscontainer } | gci

这可行,但调用 gci 两次似乎是一种浪费,我希望我只是没有找到像 -Path、-Filter 或 -Include 这样的正确通配符表达式。

最好的方法是什么?

【问题讨论】:

    标签: powershell get-childitem


    【解决方案1】:

    我会使用 Filter 参数而不是 Include,它执行得更胖

    gci .\topfolder -rec -filter *foo* | where { $_.psiscontainer } | gci
    

    【讨论】:

    • 它和我上一个例子有什么不同?会不会比我的尝试还要慢?
    • 对不起,我一定是瞎了;)
    • 谢谢这是一个很好的优化技巧(我什至不确定 -Include 和 -Filter 之间有什么区别),但是,这是否也意味着仅使用单个 gci 无法完成此任务?我基本上需要.\toplevel\*foo* 匹配toplevel\subfolder\foobar。 PowerShell 是这样工作的吗?文档说“星号匹配零个或多个字符”,所以我希望第一个星号匹配subfolder` and the second bar`,以便整个目录名称匹配。然而,情况似乎并非如此。
    • 对不起,我弄乱了格式。希望你能理解我的意思。
    • 这就是它的工作方式。如果您过滤文件夹,那么您需要列出它们以获取它们的内容,如果您过滤文件,您需要检查它们的全名(路径)或 directoryName 属性并将您的标准基于它们。有时第一种方法是合适的,有时是后者。
    猜你喜欢
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    相关资源
    最近更新 更多