如何在Windows中用BAT/PowerShell查找带通配符子目录中的文件
解决Windows BAT中查找带通配符目录下的指定文件问题
你遇到的问题确实是FOR /R的一个限制——它的起始路径参数不支持通配符。不过我们可以通过嵌套两层FOR循环来绕开这个限制,先枚举所有匹配目录,再在每个目录里递归查找文件。
命令行直接执行版本
如果你是在CMD窗口里直接敲命令,用这个:
FOR /D %d IN (ba*) DO FOR /R "%d" %f IN (foo*) DO @echo %~dpnf
批处理文件版本
如果是写在.bat或.cmd文件里,要把变量引用改成%%(批处理里需要转义百分号):
@echo off :: 关闭命令本身的回显,只显示结果 FOR /D %%d IN (ba*) DO ( :: 遍历所有匹配ba*的一级子目录 FOR /R "%%d" %%f IN (foo*) DO ( :: 在每个目录下递归查找匹配foo*的文件,输出完整路径 echo %%~dpnf ) )
关键细节解释
FOR /D %d IN (ba*):专门用来枚举当前目录下所有匹配ba*的一级子目录,这一步解决了目录通配符的问题。FOR /R "%d" %f IN (foo*):对每个找到的目录%d,递归遍历其下所有子目录,查找匹配foo*的文件。把%d用引号括起来,是为了兼容带空格的目录名。%~dpnf:这是变量扩展语法,用来获取文件的完整路径+文件名+扩展名。如果你只需要文件所在的路径,可以换成%~dpf;如果只需要相对路径,用%~pf就行。
额外提示
- 如果
ba*没有匹配到任何目录,FOR /D会直接跳过内层循环,不会抛出错误,脚本可以正常结束。 - 要是你要找的是精确文件名(比如
foo.txt),直接把foo*换成foo.txt即可。
内容的提问来源于stack exchange,提问作者umläute
相关产品推荐
相关产品推荐

