CMD for /d循环通配符筛选目录时出现异常匹配结果的问题
匹配异常的根本原因
这个现象是Windows NTFS分区默认开启的8.3短文件名兼容机制导致的,和CMD的for循环本身逻辑无关。
- 为了兼容DOS、早期Windows平台的老旧程序,系统会自动给所有不符合8.3命名规则(文件名最长8个字符、后缀最长3个字符,不能含空格等特殊字符)的文件、文件夹生成一个短别名。当同目录下前缀相似的文件/文件夹数量较多时,短别名会按规则插入哈希值、数字序号,不会和长文件名完全对应。
- CMD调用Windows系统API做通配符路径匹配时,默认会同时匹配对象的长文件名和对应的8.3短文件名:只要两个名称中任意一个符合通配符规则,对象就会被枚举出来。
你遇到的New folder - Copy (2)、New folder - Copy (10)这类长名称不含3的文件夹被匹配到,原因就是它们自动生成的8.3短文件名里恰好包含字符3。你可以在目标目录执行dir /x命令,就能直接看到所有文件夹对应的短别名,核对后就能确认这些异常匹配项的短名中一定存在字符3。
可行的解决方法
- 最稳妥的方案是枚举完目录项后增加一层长文件名校验,只输出长名称确实包含3的文件夹,命令参考如下:
for /d %n in (C:\Users\Ahmed\Desktop\Playing_Field\*) do @echo %~nxn | findstr "3" >nul && echo "%n"
- 如果不需要为老旧程序保留8.3兼容能力,也可以执行管理员命令
fsutil behavior set disable8dot3 C: 1关闭C盘的短文件名自动生成功能,重启后新建的文件/文件夹不会再生成短别名,也就不会出现这类通配符误匹配问题。注意该操作不会删除已经生成的历史短名,且可能导致极老的16位/32位早期Windows程序无法正常运行。
内容的提问来源于stack exchange,提问作者Ahmed Hisham
相关产品推荐
相关产品推荐

