如何将 Get-ChildItem 用于 return 没有扩展名的文件?
How do I use Get-ChildItem to return files that don't have an extension?
我想获取没有文件扩展名的文件列表。考虑我的目录的内容是:
folder
file1
file2.mp4
我的目标是只获得 file1
。
运行 Get-ChildItem -Exclude *.* -File
return什么都没做。
运行 Get-ChildItem -Exclude *.*
returned folder
和 file1
.
运行 Get-ChildItem -File
returned file1
和 file2.mp4
.
知道是否有任何方法可以将 Get-ChildItem 仅用于 return file1
?
在 PSv3+ 中,但 在 PowerShell 中不起作用 Core v6.x,已在 v7 中修复(参见 this GitHub issue):
Get-ChildItem -File -Filter *.
-File
将输出限制为文件(而不是目录)。
-Filter *.
仅选择那些没有扩展名的文件。
出于性能原因,-Filter
通常优于 -Include
/ -Exclude
,因为它在源 处过滤 ,而不是返回所有对象并让 PowerShell 进行过滤。
在 PSv2 中,-File
开关不可用,您需要额外的 Where-Object
调用以将结果限制为 files,正如 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
会改变它,但会搜索整个目录 subtree.
- 虽然您 应该 能够添加
-Depth 0
以限制直接子项目的匹配,同时仍然能够应用 -Include
/ -Exclude
,从 Windows PowerShell v5.1 开始,这是 broken:在这种情况下,-Depth
参数被 ignored .
但是,此问题已在 PowerShell Core 中修复。
简而言之:-Include
/ -Exclude
此处不提供解决方案。
我想获取没有文件扩展名的文件列表。考虑我的目录的内容是:
folder
file1
file2.mp4
我的目标是只获得 file1
。
运行 Get-ChildItem -Exclude *.* -File
return什么都没做。
运行 Get-ChildItem -Exclude *.*
returned folder
和 file1
.
运行 Get-ChildItem -File
returned file1
和 file2.mp4
.
知道是否有任何方法可以将 Get-ChildItem 仅用于 return file1
?
在 PSv3+ 中,但 在 PowerShell 中不起作用 Core v6.x,已在 v7 中修复(参见 this GitHub issue):
Get-ChildItem -File -Filter *.
-File
将输出限制为文件(而不是目录)。-Filter *.
仅选择那些没有扩展名的文件。
-Filter
通常优于 -Include
/ -Exclude
,因为它在源 处过滤 ,而不是返回所有对象并让 PowerShell 进行过滤。
在 PSv2 中,-File
开关不可用,您需要额外的 Where-Object
调用以将结果限制为 files,正如 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
会改变它,但会搜索整个目录 subtree. - 虽然您 应该 能够添加
-Depth 0
以限制直接子项目的匹配,同时仍然能够应用-Include
/-Exclude
,从 Windows PowerShell v5.1 开始,这是 broken:在这种情况下,-Depth
参数被 ignored .
但是,此问题已在 PowerShell Core 中修复。
- 指定
简而言之:-Include
/ -Exclude
此处不提供解决方案。