dav*_*o12 4 powershell get-childitem
我想获取没有文件扩展名的文件列表。考虑我的目录的内容是:
folder
file1
file2.mp4
Run Code Online (Sandbox Code Playgroud)
我的目标是file1只获得。
运行Get-ChildItem -Exclude *.* -File没有返回任何结果。
运行Get-ChildItem -Exclude *.*返回folder并file1。
运行Get-ChildItem -File返回file1并file2.mp4。
知道是否有任何方法可以使用 Get-ChildItem 仅返回file1?
在PSv3+中,但在 PowerShell Core v6.x中不起作用,在 v7 中修复(请参阅此 GitHub 问题):
Get-ChildItem -File -Filter *.
Run Code Online (Sandbox Code Playgroud)
-File将输出限制为仅文件(而不是目录)。
-Filter *.仅选择那些没有扩展名的文件。
-Filter出于性能原因,通常优于-Include/ ,因为它在源处进行过滤,而不是返回所有对象并让PowerShell进行过滤。-Exclude
在PSv2中,该-File开关不可用,您需要额外的Where-Object调用来将结果限制为files,正如TheIncorrigible1指出的那样:
Get-ChildItem -Filter *. | Where-Object { -not $_.PSIsContainer }
Run Code Online (Sandbox Code Playgroud)
较慢的PowerShell Core解决方案:
Get-ChildItem -File | Where-Object -Not Extension
Run Code Online (Sandbox Code Playgroud)
可选背景信息:
参数由底层提供程序-Filter处理,而不是由 PowerShell 处理,这意味着它的行为可能与 PowerShell 不同,这里的情况确实如此:FileSystem 提供程序使用Windows API 的通配符表达式匹配,其功能也比 PowerShell 少作为一些历史怪癖;此外,它仅限于单个通配符表达式,而-Include/-Exclude支持多个通配符表达式(用 分隔,)。
然而,这里-Filter提供了 PowerShell 的通配符匹配所没有的功能:用于*.匹配不带扩展名的文件/目录。
-Include/-Exclude通常以牺牲性能为代价提供功能优势,但它们有自己的局限性和怪癖:
*.不支持在PowerShell的通配符语言中匹配没有扩展名的项目,并且据我所知,没有基于通配符的方法来实现此目的。
-Include/-Exclude对指定或隐含路径的最后一个组成部分进行操作,因此,如果您隐式定位当前目录,它们将应用于该目录 path,而不是其中的各个文件。
-Recurse会更改该内容,但会搜索整个目录子树。-Depth 0对直接子项的限制匹配,同时仍然能够应用-Include/ -Exclude,但从 Windows PowerShell v5.1 开始,这种情况已被破坏-Depth:在这种情况下,该参数将被忽略。简而言之:-Include/-Exclude这里不提供解决方案。
| 归档时间: |
|
| 查看次数: |
3947 次 |
| 最近记录: |