批处理脚本大小写敏感初始化问题:字母转数字无法区分大小写
解决批处理脚本大小写不敏感的字母转数字问题
问题根源
批处理的环境变量名不区分大小写,你定义的A=1和a=2实际上是同一个变量,后续的a=2会覆盖前面的A=1,导致无论输入大写还是小写的A,取到的值都是2,所以输入"Aa"时输出"22"。
解决方案一:基于ASCII码计算(推荐,适配你的映射规则)
利用大小写字母的ASCII码范围(大写A-Z为65-90,小写a-z为97-122),结合你需要的A=1,a=2,B=3,b=4...映射规则,直接计算对应数字:
@ECHO OFF setlocal enabledelayedexpansion set "nickname= " set /P "nickname=Enter here: " set "nickname=%nickname: =%" if not defined nickname goto :EOF set "out=" set "nums=" set "sum=0" :loop set "char=!nickname:~0,1!" set "out=!out!!char!" :: 获取字符的ASCII码值 set /A "ascii=!char!" :: 处理大写字母:A(65)→1,B(66)→3...公式:(ASCII-64)*2-1 if !ascii! geq 65 if !ascii! leq 90 ( set /A "code=(!ascii!-64)*2-1, sum+=code" ) :: 处理小写字母:a(97)→2,b(98)→4...公式:(ASCII-96)*2 if !ascii! geq 97 if !ascii! leq 122 ( set /A "code=(!ascii!-96)*2, sum+=code" ) set "nums=!nums!!code!" set "nickname=!nickname:~1!" IF DEFINED nickname GOTO :loop ECHO original: %out% ECHO converted to: %nums% pause endlocal
解决方案二:自定义映射表(适合非顺序映射)
如果后续需要调整映射规则,可以用自定义映射表,通过精确匹配字符来获取对应值:
@ECHO OFF setlocal enabledelayedexpansion :: 自定义大小写映射表,格式:字符|数字,多个用逗号分隔 set "map=A|1,a|2,B|3,b|4,C|5,c|6" set "nickname= " set /P "nickname=Enter here: " set "nickname=%nickname: =%" if not defined nickname goto :EOF set "out=" set "nums=" set "sum=0" :loop set "char=!nickname:~0,1!" set "out=!out!!char!" set "code=" :: 遍历映射表匹配当前字符(大小写敏感) for %%i in ("!map:,=" "!") do ( echo %%~i | findstr /R /C:"^!char!|.*$" >nul if not errorlevel 1 ( for /F "tokens=2 delims=|" %%b in ("%%~i") do ( set "code=%%b" set /A sum+=code ) ) ) set "nums=!nums!!code!" set "nickname=!nickname:~1!" IF DEFINED nickname GOTO :loop ECHO original: %out% ECHO converted to: %nums% pause endlocal
关键说明
- 启用
enabledelayedexpansion是为了在循环中动态获取和更新变量值,用!变量名!代替%变量名%。 - 方案一的公式完全适配你给出的映射规则,若后续规则变化,只需调整公式即可。
- 方案二的映射表可以自由扩展,添加更多字符和数字的对应关系。
内容的提问来源于stack exchange,提问作者Kenneth aka ComKat
相关产品推荐
相关产品推荐

