【问题标题】:How do I use Get-ChildItem to return files that don't have an extension? [duplicate]如何使用 Get-ChildItem 返回没有扩展名的文件? [复制]
【发布时间】:2018-08-07 02:45:35
【问题描述】:

我想获取没有文件扩展名的文件列表。考虑我的目录的内容是:

folder
file1
file2.mp4

我的目标是只获得file1

运行 Get-ChildItem -Exclude *.* -File 没有返回任何结果。

运行 Get-ChildItem -Exclude *.* 返回 folderfile1

运行Get-ChildItem -File 返回file1file2.mp4

知道是否有任何方法可以使用 Get-ChildItem 仅返回 file1

【问题讨论】:

    标签: powershell get-childitem


    【解决方案1】:

    PSv3+ 中,但在 PowerShell Core v6.x 中不起作用,在 v7 中已修复(请参阅 this GitHub issue):

    Get-ChildItem -File -Filter *.
    
    • -File 将输出限制为仅文件(而不是目录)。

    • -Filter *. 只选择那些没有扩展名的文件。

    出于性能原因,

    -Filter 通常比-Include / -Exclude 更可取,因为它在源头进行过滤,而不是返回所有对象并让PowerShell进行过滤。

    PSv2 中,-File 开关不可用,您需要额外调用 Where-Object 以将结果限制为文件,如 TheIncorrigible1指出:

    Get-ChildItem -Filter *. | Where-Object { -not $_.PSIsContainer }
    

    较慢的 PowerShell Core 解决方案:

    Get-ChildItem -File | Where-Object -Not Extension
    

    可选背景信息

    -Filter 参数由底层提供程序处理,而不是由 PowerShell,这意味着它的行为可能与 PowerShell 不同,这里确实是这种情况:文件系统提供程序使用 Windows API 的通配符表达式匹配,它的功能比 PowerShell 的少,还有一些历史怪癖;此外,它仅限于单个通配符表达式,而-Include / -Exclude 支持多个通配符(以, 分隔)。

    然而,-Filter 提供了 PowerShell 通配符匹配所不具备的功能:使用 *. 匹配不带扩展名的文件/目录。

    -Include / -Exclude 通常以牺牲性能为代价提供功能优势,但它们也有自己的局限性和怪癖

    • *. 不支持匹配 PowerShell's wildcard language 中没有扩展名的项目,据我所知,没有基于通配符的方法来实现这一点。

    • -Include / -Exclude指定或隐含路径的最后一个组件进行操作,因此如果您隐式定位当前目录,它们适用于那个目录路径,而不是里面的个别文件。

      • 指定-Recurse 会改变这一点,但会搜索整个目录子树
      • 虽然您应该能够添加 -Depth 0 以限制对直接子项的匹配,同时仍然能够应用 -Include / -Exclude,但这是损坏 em> 从 Windows PowerShell v5.1 开始:在这种情况下,-Depth 参数被忽略
        不过,此问题已在 PowerShell Core 中得到修复。

    简而言之:-Include / -Exclude 在这里不提供任何解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      • 2016-09-25
      • 1970-01-01
      • 2012-06-11
      • 2011-12-28
      相关资源
      最近更新 更多