为何批处理执行del命令无法删除含省略号的文件而CMD正常
批处理执行del命令无法删除带省略号文件名的文件,CMD直接执行却正常
问题背景
本人从1988年MSDOS 3.2时期就开始编写使用批处理,经验覆盖到Windows 7,当前使用系统为Windows 10 Pro 21H1,近期遇到如下问题:在批处理文件中执行del命令无法删除特定文件,但在CMD命令行中执行完全相同的命令就可以正常删除,问题疑似和文件名包含省略号字符有关。
问题详情
执行dir命令列出目录内容,对应E:\Backups\Magpie\2016-12-14-P\mike\Correspondence\Friends\Berg\In目录下的文件列表如下:
Volume in drive E has no label. Volume Serial Number is 3D74-5A3F Directory of E:\Backups\Magpie\2016-12-14-P\mike\Correspondence\Friends\Berg\In 10/21/2021 03:27 PM <DIR> . 10/21/2021 03:27 PM <DIR> .. 08/16/2021 03:15 AM 40,888 20160114-Fwd_ [New post] Biologist's comments to save White Mountain & Little Colorado wild horses (Today is the last day YOU can comment)-29324528.eml 08/16/2021 03:15 AM 21,095 20160229-More.-13257179.eml 08/16/2021 03:15 AM 47,526 20160229-Re_More…-13334902.eml 08/16/2021 03:15 AM 11,256,759 20160819-(Duplicate) Whew. Re_ Good thurs am God bless your first day back to work-10.eml 10/21/2021 02:48 PM 182 DeleteDuplicatesDC.bat 10/20/2021 06:19 PM <DIR> Photos 10/21/2021 02:00 PM <DIR> Temp 6 File(s) 11,366,450 bytes 4 Dir(s) 199,814,967,296 bytes free
需要删除的是第三个文件20160229-Re_More…-13334902.eml,注意文件名中More后方的三个点是单个省略号字符,并非三个独立的半角句号。
本次使用的批处理由自行编写的宏生成,用于批量组装删除指令,处理符合特定条件的上千个目标文件,批处理中对应操作的代码如下:
Echo 271 CD "E:\Backups\Magpie\2016-12-14-P\mike\Correspondence\Friends\Berg\In\" del "20160229-Re_More…-13334902.eml" Echo 271
其中Echo命令仅用于输出数字标识批处理执行进度。该批处理包含数百条类似指令,用于删除不同目录下的大量文件,运行后大部分目标文件都被正常删除,唯独20160229-Re_More…-13334902.eml未能删除。
验证测试
将批处理中的命令逐条复制到CMD命令行执行:
- 复制
CD "E:\Backups\Magpie\2016-12-14-P\mike\Correspondence\Friends\Berg\In\"粘贴到CMD窗口执行,成功进入目标目录 - 复制
del "20160229-Re_More…-13334902.eml"粘贴到CMD窗口执行,del命令成功删除该文件,文件资源管理器中同步显示该文件消失
该测试证明cd和del命令本身逻辑正确,可正常完成切换目录、删除目标文件的操作,但相同命令在批处理中运行时,del命令始终无法删除带省略号字符的文件。
问题原因
核心原因是批处理文件的编码与CMD默认使用的编码不匹配:
- 直接在CMD粘贴命令时,字符使用的是CMD窗口默认的活动代码页(简体中文系统通常是GBK/CP936,英文系统通常是CP437),省略号字符可以被正确识别
- 宏生成的批处理文件大概率是UTF-8编码,而CMD默认执行批处理时不会以UTF-8解码文件,导致省略号字符被解析为乱码,
del命令找不到对应文件名的文件
解决方案
任选其一即可:
- 方案1:在批处理文件最开头添加代码页切换命令,强制CMD使用UTF-8编码解析后续内容:
其中chcp 65001 >nul>nul用于屏蔽chcp命令的输出信息,不影响核心功能 - 方案2:将批处理文件以ANSI编码(对应你系统默认代码页)重新保存,字符就能被CMD正常识别
- 方案3:如果不想修改编码,也可以使用通配符规避特殊字符识别问题,将删除命令改为:
其中del "20160229-Re_More?-13334902.eml"?通配符匹配任意单个字符,可绕过省略号的编码解析问题
内容的提问来源于stack exchange,提问作者Mike Walsh
相关产品推荐
相关产品推荐

