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

dav*_*o12 4 powershell get-childitem

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

folder
file1
file2.mp4
Run Code Online (Sandbox Code Playgroud)

我的目标是file1只获得。

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

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

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

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

mkl*_*nt0 5

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

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

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

-Filter出于性能原因,通常优于-Include/ ,因为它在源处进行过滤,而不是返回所有对象并让PowerShell进行过滤。-Exclude

PSv2中,该-File开关不可用,您需要额外的Where-Object调用来将结果限制为files,正如TheIncorrigible1指出的那样:

Get-ChildItem -Filter *. | Where-Object { -not $_.PSIsContainer }
Run Code Online (Sandbox Code Playgroud)

较慢的PowerShell Core解决方案:

Get-ChildItem -File | Where-Object -Not Extension
Run Code Online (Sandbox Code Playgroud)

可选背景信息

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

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

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

  • *.不支持在PowerShell的通配符语言中匹配没有扩展名的项目,并且据我所知,没有基于通配符的方法来实现此目的。

  • -Include/-Exclude指定或隐含路径的最后一个组成部分进行操作,因此,如果您隐式定位当前目录,它们将应用于该目录 path,而不是其中的各个文件。

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

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