PowerShell中Get-ChildItem使用路径通配符结合-File参数时的异常行为问询
PowerShell中Get-ChildItem使用路径通配符结合-File参数时的异常行为问询
你遇到的这个现象确实挺反直觉的,我帮你梳理下测试场景和可能的原因,再给你几个可行的解决办法:
你的测试环境与操作结果
首先明确你的文件夹结构:
d:\test\fooA\foo\:包含1-9.txt文件d:\test\fooB\foo\:包含1-9.txt文件d:\test\fooC\foo\:包含1-9.txt文件d:\test\fooD\foo\:包含1-9.txt目录
你执行的四个命令及结果:
正常返回所有文件和目录:
Get-ChildItem -Filter *.txt -Path D:\test\*\foo -Recurse符合预期,递归遍历所有匹配
D:\test\*\foo的路径,返回所有.txt后缀的项。仅返回目录:
Get-ChildItem -Directory -Filter *.txt -Path D:\test\*\foo -Recurse符合预期,只筛选出
.txt后缀的目录项。无任何结果(不符合预期):
Get-ChildItem -File -Filter *.txt -Path D:\test\*\foo -Recurse你预期会返回所有
.txt文件,但实际没有输出。无任何结果:
Get-ChildItem -Directory -File -Filter *.txt -Path D:\test\*\foo -Recurse这个其实逻辑本身矛盾(一个项不可能既是文件又是目录),无结果是合理的,核心问题还是第三个命令的异常。
问题原因分析
这个现象本质是PowerShell处理-Path通配符与-File参数的逻辑顺序导致的:
- 用
-Directory时,PowerShell会先解析D:\test\*\foo的通配符,找到所有匹配的目录(也就是各个foo目录),再在这些目录下递归筛选.txt后缀的目录。 - 但用
-File时,PowerShell会先尝试判断D:\test\*\foo是否匹配文件——显然foo是目录,通配符解析阶段就没找到符合条件的文件路径,后续递归自然没有结果。
这个行为在PowerShell 5.1和7.x版本中都存在,属于设计上的不一致性,确实容易让人误解,更像是需要优化的设计缺陷而非你的操作错误。
解决办法
你可以通过以下两种方式绕过这个问题:
先定位目标目录,再递归搜索文件:
Get-Item -Path D:\test\*\foo | Get-ChildItem -Filter *.txt -File -Recurse先找到所有符合
D:\test\*\foo的目录,再在每个目录下递归筛选.txt文件,结果完全符合预期。先获取所有项,再过滤文件:
Get-ChildItem -Filter *.txt -Path D:\test\*\foo -Recurse | Where-Object { -not $_.PSIsContainer }先获取所有
.txt项,再过滤掉目录,只保留文件。
备注:内容来源于stack exchange,提问作者Jan Krejci
相关产品推荐
相关产品推荐

