批处理替换命令行传入参数的特殊字符失效如何解决
问题根源
这个故障是cmd活动代码页和批处理文件保存编码不匹配导致的:
- 脚本内硬编码定义的变量,解析时直接读取bat文件存储的字节内容,和你写在替换规则里的特殊字符编码完全一致,所以替换可以正常生效。
- 命令行传入的参数,是按照cmd当前默认的活动代码页解析的,如果你保存bat用的编码和cmd默认代码页不一致,替换规则里写的á、é、ñ和传入参数里的对应字符字节码根本不匹配,自然无法触发替换。你测试中只有普通ASCII字符
i替换成功,就是因为ASCII字符不存在编码偏移问题。
修复步骤
- 强制切换cmd代码页
在脚本@echo off的下一行添加代码页切换命令,强制使用UTF-8编码解析所有内容,加>nul隐藏切换时的冗余提示:
chcp 65001 >nul
- 调整批处理文件保存编码
将你的bat脚本重新保存为UTF-8 带BOM格式。注意不要保存为无BOM的UTF-8,cmd无法正确识别无BOM的UTF-8批处理文件,会出现开头字符乱码;也不要保存为ANSI(本地默认代码页,比如Windows中文环境是GBK、西文环境是Windows-1252)格式,否则依旧会出现编码不匹配问题。
修复后的完整测试脚本如下:
@echo off chcp 65001 >nul set variable=%1 set variable=%variable:á=a% set variable=%variable:é=e% set variable=%variable:i=a% set variable=%variable:ñ=n% echo %variable% set var=Holáéñ set var=%var:á=a% set var=%var:é=e% set var=%var:ñ=n% echo %var%
此时再执行prova holáéñi,命令行传入参数和内部定义变量的特殊字符都可以被正常替换。
内容的提问来源于stack exchange,提问作者Bruno Rodriguez Aranibar
相关产品推荐
相关产品推荐

