Powershell-路径中的 Get-ChildItem 星号通配符-使用参数时出现奇怪的行为-File

Powershell-路径中的 Get-ChildItem 星号通配符-使用参数时出现奇怪的行为-File

当我使用 Get-ChildItem cmdlet 时,我发现了一个奇怪的行为

文件夹结构:

d:\test\fooA\foo\1-9.txt files
d:\test\fooB\foo\1-9.txt files
d:\test\fooC\foo\1-9.txt files
d:\test\fooD\foo\1-9.txt directories

当我使用以下语法时,我将从所有递归文件夹中获取所有 1-9.txt 文件和目录。它按预期工作。

Get-ChildItem -Filter *.txt -Path D:\test\*\foo -Recurse

当我添加参数 -Directories 时,我仅获取示例中最后一个文件夹中的目录。它也按预期工作。

Get-ChildItem -Directory -Filter *.txt -Path D:\test\*\foo -Recurse

当我添加参数 -File 而不是 -Directories 时,什么也没有得到。我以为我只会得到文件。

Get-ChildItem -File -Filter *.txt -Path D:\test\*\foo -Recurse

当我使用参数 -File 和 -Directory 时我也没有得到任何结果。

Get-ChildItem -Directory -File -Filter *.txt -Path D:\test\*\foo -Recurse

我在不同的 Windows 系统上测试了 PowerShell 版本 5.1 和 7。从我的角度来看,这更像是代码中的错误而不是问题,或者我理解这个 cmdlet 的使用方法,有人可以再检查一下并发表评论吗?我可以通过额外的编码来解决我的问题,但我不明白为什么它适用于文件夹,但不适用于文件。

非常感谢您的任何评论。

答案1

这是 Powershell 的 FileSystem 提供程序的一个已知错误。Get-ChildItem在指定-File-Name参数时使用此错误。由于存在破坏现有内容的风险,它可能永远不会被修复:

https://github.com/PowerShell/PowerShell/issues/9014

建议的选项是Where-Object通过管道传输到过滤器,例如:

# Exclude directories
Get-ChildItem -Filter *.txt  -Path 'D:\test\*\foo' -Recurse | Where { -not $_.PSIsContainer }

相关内容