Powershell 如何使用Get ChildItem返回不带';我没有分机吗?

Powershell 如何使用Get ChildItem返回不带';我没有分机吗?,powershell,get-childitem,Powershell,Get Childitem,我想得到一个没有文件扩展名的文件列表。考虑我的目录的内容: folder file1 file2.mp4 我的目标是只获取file1 运行Get ChildItem-Exclude*.-File时未返回任何内容 运行Get ChildItem-Exclude*返回folder和file1 运行getchilditem-File返回file1和file2.mp4 是否有任何方法可以使用Get ChildItem在PSv3+中仅返回file1?,但在PowerShell Core v6.x中不起作

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

folder
file1
file2.mp4
我的目标是只获取
file1

运行
Get ChildItem-Exclude*.-File
时未返回任何内容

运行
Get ChildItem-Exclude*
返回
folder
file1

运行
getchilditem-File
返回
file1
file2.mp4


是否有任何方法可以使用Get ChildItem在PSv3+中仅返回
file1

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

  • -File
    仅将输出限制为文件(与目录相反)

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

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

PSv2中,如果
-File
开关不可用,则需要额外的
where Object
调用以将结果限制为文件,如下所述:

Get-ChildItem -Filter *. | Where-Object { -not $_.PSIsContainer }
较慢的PowerShell核心解决方案:

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

可选背景信息

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

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

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

  • *。
    不支持在中匹配没有扩展名的项,而且据我所知,没有基于通配符的方法来实现这一点

  • -Include
    /
    -Exclude
    对指定或隐含路径的最后一个组件进行操作,因此,如果您隐含地以当前目录为目标,则它们将应用于该目录路径,而不是其中的单个文件

    • 指定
      -Recurse
      会更改此设置,但会搜索整个目录子树
    • 虽然您应该能够添加
      -Depth 0
      以限制与直接子项的匹配,同时仍然能够应用
      -Include
      /
      -Exclude
      ,但从Windows PowerShell v5.1开始,这一点就被打破了:在这种情况下,
      -Depth
      参数被忽略。
      但是,此问题已在PowerShell Core中修复
简而言之:
-Include
/
-Exclude
此处不提供任何解决方案

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