当我使用 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 }