我想获取没有文件扩展名的文件列表。认为我目录的内容为:
folder
file1
file2.mp4
我的目标是只获得file1
。
正在运行Get-ChildItem -Exclude *.* -File
什么也没返回。
正在运行Get-ChildItem -Exclude *.*
返回了folder
和file1
。
正在运行Get-ChildItem -File
返回了file1
和file2.mp4
。
是否知道是否有使用Get-ChildItem的方式仅返回file1
?
答案 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
参数被忽略。简而言之:-Include
/ -Exclude
在这里没有提供解决方案。