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 批处理脚本编写指南