You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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目录

你执行的四个命令及结果:

  1. 正常返回所有文件和目录:

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

    符合预期,递归遍历所有匹配D:\test\*\foo的路径,返回所有.txt后缀的项。

  2. 仅返回目录:

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

    符合预期,只筛选出.txt后缀的目录项。

  3. 无任何结果(不符合预期):

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

    你预期会返回所有.txt文件,但实际没有输出。

  4. 无任何结果:

    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版本中都存在,属于设计上的不一致性,确实容易让人误解,更像是需要优化的设计缺陷而非你的操作错误。

解决办法

你可以通过以下两种方式绕过这个问题:

  1. 先定位目标目录,再递归搜索文件:

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

    先找到所有符合D:\test\*\foo的目录,再在每个目录下递归筛选.txt文件,结果完全符合预期。

  2. 先获取所有项,再过滤文件:

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

    先获取所有.txt项,再过滤掉目录,只保留文件。

备注:内容来源于stack exchange,提问作者Jan Krejci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.21 15:14:37