0开头字符串直接进行表达式算术运算时,脚本会默认把0开头的字符串转换为8进制数值,如下:
rem a=22,021转成10进制为17,17+5=22
set /a num="021"+5
rem 会报错,028不是有效8进制。数字常数只能是十进制(17),十六位进制(0x11)或八进制(021)。
set /a num="028"+5
类似09,028等显然不是有效8进制数,为此0开头的字符串转成数值需要特殊处理,如何实现呢?
比如日期:2020-09-12 00:00:00,需要获取月份进行一些运算:
1)可通过字符串截取得到 月份是9月:09, set mm=09
2)09 转换成数字,因为月份就2位,所以可以加10000然后对100求模,如下:
rem 10009%100得到9
set /a m=100%mm%%%100
比如:012987623、001233445怎么处理?
1)计算位数,知道了位数,就同已知位数情况:写个循环除10,次数累加即可获取位数
2)字符串去前置0,类似高级语言的ltrim,代码strzero.bat如下:
@echo off & setlocal enabledelayedexpansion
set str2="00987"
call :trimZero %str2%
rem 00=>0,00987=>987,0987=>987
echo %result%
goto :eof
:trimZero
set i=0
set strnum=%~1
:loop
if "!strnum:~%i%,1!" == "0" (
set /a i+=1
goto loop
)
set result=!strnum:~%i%!
if not defined result set result=0
goto :eof
代码说明:
本案例涉及函数定义、调用,变量延时读取等知识点,关于BAT批处理脚本开发基础指南,可以参考:windows bat 批处理脚本编写指南