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

时间:2018-08-07 02:45:36

标签: powershell get-childitem

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

folder
file1
file2.mp4

我的目标是只获得file1

正在运行Get-ChildItem -Exclude *.* -File什么也没返回。

正在运行Get-ChildItem -Exclude *.*返回了folderfile1

正在运行Get-ChildItem -File返回了file1file2.mp4

是否知道是否有使用Get-ChildItem的方式仅返回file1

1 个答案:

答案 0 :(得分:3)

PSv3 + 中,但从v6.2.0版开始在PowerShell Core 中不起作用(请参见this GitHub issue):< / p>

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的行为,在这里确实如此: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在这里没有提供解决方案。