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

4

我希望获得一个没有文件名扩展名的文件列表。假设我的目录内容如下:

folder
file1
file2.mp4

我的目标是只获取file1
运行Get-ChildItem -Exclude *.* -File没有返回任何结果。
运行Get-ChildItem -Exclude *.*返回了folderfile1
运行Get-ChildItem -File返回了file1file2.mp4
您有什么想法是否有任何方法可以使用Get-ChildItem只返回file1
1个回答

5
在PSv3+中,但在PowerShell Core v6.x中无法使用,已在v7中修复(参见此GitHub问题):
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通配符语言 中不支持匹配没有扩展名的项目,我也不知道有什么基于通配符的方法可以实现这一点。

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

    • 指定 -Recurse 可以改变这种情况,但是它会搜索整个目录子树
    • 虽然您应该能够添加-Depth 0来限制匹配到仅适用于直接子项,同时仍能应用-Include / -Exclude,但在Windows PowerShell v5.1中,这是无效的:在这种情况下,-Depth参数被忽略
      但是,这个问题在PowerShell Core中已经被修复了。
简而言之:-Include / -Exclude 在这里无法提供解决方案。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接