• 批处理变量的数学运算


    用set命令进行简单计算

    语法:SET /A expression
    /A 命令行开关指定等号右边的字符串为被评估的数字表达式。该表达式
    评估器很简单并以递减的优先权顺序支持下列操作:
    () -分组
    ! ~ - -一元运算符
    * / % -算数运算符
    + - -算数运算符
    << >> -二进制逻辑移位
    & -二进制按位“与”
    ^ -二进制按位“异”
    | -二进制按位“或”
    = *= /= %= += -= -算数赋值
    &= ^= |= <<= >>= -二进制运算赋值
    , -表达式分隔符

    如果 SET /A 在命令脚本外的命令行执行的,那么它显示该表达式的最后值。
    除十六进制有 0x 前缀, 八进制有 0 前缀的,数字值为十进位数字。
    因此, 0x12 与 18 和 022相同。请注意八进制公式可能很容易搞混:
    08 和 09 是无效的数字,因为 8 和 9 不是有效的八进制位数。

    上面这些是系统帮助里的内容,看着是不是有点晕,没关系我来简单解释一下:
    set的/A参数就是让SET可以支持数学符号进行加减等一些数学运算!

    注意:一般的运算常为十进制运算,如果数字字符串最左边为0,将被认为是八进制,从而出错。比如,0812之类的数字不能参与十进制运算,转换方法为:10812-10000

    例:
    set aa=0812
    set /a aa=1%aa%-10000
    echo %aa%
    结果为:812


    例:
    @echo off
    set /p input=请输入计算表达式:
    set /a var=%input%
    echo 计算结果:%input%=%var%
    pause

    上面的例子是龙卷风设计的,很好用哟,请看下面几个运算过程:
    注意:DOS计算只能进行整数运算,精确到整数

    请输入计算表达式:1+9+20+30-10
    计算结果:1+9+20+30-10=50
    请按任意键继续. . .

    请输入计算表达式:10/3 #除法只能精确到整数
    计算结果:10/3=3
    请按任意键继续. . .

    请输入计算表达式:-100+62#负数
    计算结果:-100+62=-38
    请按任意键继续. . .

    请输入计算表达式:100%3 #求余数
    计算结果:100%3=1
    请按任意键继续. . .
    注意:以上的求余数运算符%在批处理程序中必须写成%%


    请输入计算表达式:(25+75)*2/(15+5) #括号
    计算结果:(25+75)*2/(15+5)=10
    请按任意键继续. . .


    请输入计算表达式:1234567890*9876543210 #范围
    无效数字。数字精确度限为 32 位。
    计算结果:1234567890*9876543210=
    请按任意键继续. . .

    注意:上面的计算过程显示,DOS计算只能精确到32位,这个32位是指二进制32位,其中最高位为符号位(0为正,1为负),低位31位为数值。 31个1换成十进制为2147483647,所以DOS计算的有效值范围是-2147483648至2147483647,超出该数值范围时计算出错,请看下面的计算过程:

    请输入计算表达式:2147483647-1 #最大值减1,值有效
    计算结果:2147483647-1=2147483646
    请按任意键继续. . .

    请输入计算表达式:2147483647+1 #最大值加1,出错,结果为最小值
    计算结果:2147483647+1=-2147483648
    请按任意键继续. . .

    请输入计算表达式:-2147483648-1 #最小值减1,出错,结果为最大值
    计算结果:-2147483648-1=2147483647
    请按任意键继续. . .

    运行set /a a=1+1,b=2+1,c=3+1后会显示一个4,但我们用
    echo %a% %b% %c%后看结果,会发现其他数学运算也有效果!,这就是表达式分隔符"逗"号的
    作用!


    有时候我们需要直接在原变量进行加减操作就可以用这种语法
    set /a var+=1这样的语法对应原始语法就是set /a var = %var% + 1
    都是一样的结果,在原变量的值上在进行数学运算,不过这样写简单一点
    再来一个:
    set /a var*=2
    其他都这么用,只要帮助里有这个语法!


    另外还有一些用逻辑或取余操作符,这些符号,按照上面的使用方法会报错的

    比如我们在CMD里输入set /a var=1 & 1 "与运算",他并不会显示为1,而是报错,
    为什么?对于这样的"逻辑或取余操作符",我们需要把他们用双引号引起来,也可以用转义字符^,看例子

    set /a var= 1 "&" 1 这样结果就显示出来了,其他逻辑或取余操作符用法
    set /a var= 1 "+" 1 异运算
    set /a var= 1 "%" 1取模运算
    set /a var= 3 "<<" 2 左移位运算, 3的二进制为11,左移2位为1100,换成十进制就是12,自行验证
    set /a var= 4 ">>" 2右移位运算,4的二进制为100,右移动2位为1,结果为1

    龙卷风补充:凡是按位计算均需换算成二进制。

    思考题:求2的n次方
    参考答案:
    @echo off
    set /p n=请输入2的几次方:
    set /a num=1^<^<n
    echo %num%
    pause

    运行结果:
    请输入2的几次方: 3
    8
    请按任意键继续. . .

    请输入2的几次方: 10
    1024
    请按任意键继续. . .

    请输入2的几次方: 15
    32768
    请按任意键继续. . .

    三、用set命令进行字符串处理


    1、字符串替换

    好了,符号说到这,现在说%PATH:str1=str2%
    上面语法的意思就是:将字符串变量%PATH%中的str1替换为str2
    这个是替换变量值的内容,看例子
    @echo off
    set a= bbs. verybat. cn
    echo 替换前的值: "%a%"
    set var=%a: =%
    echo 替换后的值: "%var%"
    pause

    运行显示:(龙卷风添加)
    替换前的值: " bbs. verybat. cn"
    替换后的值: "bbs.verybat.cn"

    对比一下,我们发现他把变量%a%的空格给替换掉了,从这个例子,我们就可以发现
    %PATH:str1=str2%这个操作就是把变量%PATH%的里的str1全部用str2替换

    比如我们把上面的例子改成这样
    @echo off
    set a=bbs.verybat.cn
    echo 替换前的值: "%a%"
    set var=%a:.=伤脑筋%
    echo 替换后的值: "%var%"
    pause

    运行显示:
    替换前的值: "bbs.verybat.cn"
    替换后的值: "bbs伤脑筋verybat伤脑筋cn"

    解释set var=%a:.=伤脑筋%
    set是命令 var是变量名 字a是要进行字符替换的变量的值,"."为要替换的值,
    "伤脑筋"为替换后的值!
    执行后就会把变量%a%里面的"."全部替换为"伤脑筋"
    这就是set的替换字符的很好的功能! 替换功能先讲到这,下面将字符串截取功能

    请注意:字符串的替换和截取功能在引用变量的地方均可以,并不一定必须要有set命令
    例:
    @echo off
    set a=bbs.verybat.cn
    echo 替换前的值: "%a%"
    echo 替换后的值: "%a:.=伤脑筋%"
    pause
    此例在echo语句中就替换了字符串,效果一样。


    2、字符串截取

    **********************************************
    截取功能统一语法格式为:%a:~[m[,n]]%
    **********************************************
    方括号表示可选,%为变量标识符,a为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)


    %PATH:~10,5%这个什么意思,看例子:

    截取功能例子1:
    @echo off
    set a=bbs.verybat.cn
    set var=%a:~1,2%
    echo %var%
    pause

    执行后,我们会发现只显示了"bs"两个字母,我们的变量%a%的值不是为bbs.verybat.cn吗?
    怎么只显示了第2个字母和第3个字母"bs",分析一结果我们就可以很容易看出
    %PATH:~10,5%就是显示变量PATH里从11位(偏移量10)开始的5个字符!
    分析set var=%a:~1,2%
    set是命令,var是变量值,a要进行字符操作的变量,"1"从变量"a"第几位开始显示,"2"表示显示几位。
    合起来就是把变量a的值从第2位(偏移量1)开始,把2个字符赋予给变量var
    这样应该明白了吧~

    其他两种语法
    %PATH:~-10%
    %PATH:~0,-2%
    他们也是显示指定变量指定几位的值的意思

    %PATH:~-10% 看例子

    截取功能例子2:
    @echo off
    set a=bbs.verybat.cn
    set var=%a:~-3%
    echo %var%
    pause
    运行结果:.cn
    这个就是把变量a倒数3位的值给变量VAR

    当然我们也可以改成这样
    截取功能例子3:
    @echo off
    set a=bbs.verybat.cn
    set var=%a:~3%
    echo %var%
    pause
    运行显示:.verybat.cn
    这个就是把变量a的从第3位开始后面全部的值给变量VAR

    %PATH:~0,-2%例子

    截取功能例子4:
    @echo off
    set a=bbs.verybat.cn
    set var=%a:~0,-3%
    echo %var%
    pause
    执行后,我们发现显示的是"bbs.verybat",少了".cn"
    从结果分析,很容易分析出,这是把变量a的值从0位开始,
    到倒数第三位之间的值全部赋予给var

    如果改成这样

    截取功能例子5:
    @echo off
    set a=bbs.verybat.cn
    set var=%a:~2,-3%
    echo %var%
    pause
    运行显示:s.verybat
    那么他就是显示从第3位(偏移量2)开始减去倒数三位字符的值,并赋予给变量var

    讲得好,例子就是说明问题,为便于记忆,龙卷风小节如下:
    a=bbs.verybat.cn
    %a:~1,2% =“bs” 偏移量1,从第二位开始向右取2位
    %a:~-3% =“.cn”偏移量负3,即倒数3位(也可理解为留下右边3位),右取全部
    %a:~3% =“.verybat.cn” 偏移量3(也可理解为去掉左边3位),右取全部
    %a:~0,-3% =“bbs.verybat” 偏移量0,右取长度至负3,即倒数3位
    %a:~2,-3% =“s.verybat”偏移量2,右取长度至负3,即倒数3位

    **********************************************
    所以,截取功能统一语法格式为:%a:~[m[,n]]%
    **********************************************
    方括号表示可选,%a%为变量名,不可少,冒号用于分隔变量名和说明部分,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)
    上面所述用法其实相当于vbs函数mid、left、right
    %a:~0,n%相当于函数left(a,n)取左边n位
    %a:~-m%相当于函数right(a,m) 取右边m位
    %a:~m,n% 相当于函数mid(a,m+1,n) 从m+1位开始取n位
    %a:~m,-n% 相当于函数mid(a,m+1,len(a)-m-n),从m+1位开始,至倒数n+1位
    %a:~m %相当于函数mid(a,m+1,len(a)-m) 或者right(a,len(a)-m),从m+1位开始取右边全部。

    思考题目:输入任意字符串,求字符串的长度
    参考答案:

    @echo off
    set /p str=请输入任意长度的字符串:
    echo 你输入了字符串:"%str%"
    call :stringlenth "%str%" num
    echo 字符串长度为:%num%
    pause
    exit

    :StringLenth
    ::---------字符串长度计算子程序
    ::---------参数%1为字符串(如有空格,请用引号括起来)
    ::---------参数%2为返回变量名称,不能含空格或特殊字符
    ::@echo off
    set theString=%~1
    if not defined theString goto :eof
    set Return=0
    :StringLenth_continue
    set /a Return+=1
    set thestring=%thestring:~0,-1%
    if defined thestring goto StringLenth_continue
    if not "%2"=="" set %2=%Return%
    goto :eof

     欢迎加入QQ技术群聊:70539804

  • 相关阅读:
    gThumb 3.1.2 发布,支持 WebP 图像
    航空例行天气预报解析 metaf2xml
    Baruwa 1.1.2 发布,邮件监控系统
    Bisect 1.3 发布,Caml 代码覆盖测试
    MoonScript 0.2.2 发布,基于 Lua 的脚本语言
    Varnish 入门
    快速增量备份程序 DeltaCopy
    恢复模糊的图像 SmartDeblur
    Cairo 1.12.8 发布,向量图形会图库
    iText 5.3.4 发布,Java 的 PDF 开发包
  • 原文地址:https://www.cnblogs.com/boltkiller/p/4791706.html
Copyright © 2020-2023  润新知