如何使用Get-ChildItem返回没有扩展名的文件? [重复]

问题描述 投票:2回答:1

这个问题在这里已有答案:

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

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个回答
3
投票

在PSv3 +中,但从v6.2.0开始在PowerShell Core中不起作用(请参阅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核心解决方案:

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

可选背景信息:

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

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

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

  • *.不支持在PowerShell's wildcard language中匹配没有扩展名的项目,并且没有基于通配符的方法来实现我所知道的。
  • -Include / -Exclude对指定或隐含路径的最后一个组件进行操作,因此如果您隐式地定位当前目录,它们将应用于该目录路径,而不是内部的单个文件。 指定-Recurse会更改,但会搜索整个目录子树。 虽然您应该能够添加-Depth 0来限制与直接子项的匹配,同时仍然能够应用-Include / -Exclude,但从Windows PowerShell v5.1开始,这会被破坏:在这种情况下,-Depth参数将被忽略。 但是,PowerShell Core中已修复此问题。

简而言之:-Include / -Exclude在这里没有解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.