| 本帖最后由 Hello123World 于 2011-12-22 17:35 编辑 【原】[一日一教学]批处理系列帖子索引 http://bbs.bathome.net/thread-2576-1-1.html 【续】[一日一教学]批处理系列帖子索引 http://bbs.bathome.net/thread-13798-1-1.html 帮助信息:
命令概括: set,意为“设置”。 variable,意为“变量”; /a,arithmetic,意为“算术”(感谢demon的英文提供)。 /p,prompt,意为“提示”; 参数详解: 先从光杆的set命令说起。 1.显示当前所有环境变量 输入:
效果:
2.显示以指定字符串开头的环境变量 显示以“p”开头的环境变量。 代码:
效果:
显示以“path”开头的环境变量。 代码:
效果:
3.直接给变量赋值 变量有两个属性,一是变量名,二是变量值。 建议使用c语言的变量名命名规则:“只能由数字、下划线、字母构成,且不能以数字开头”! 批处理中变量名不能以数字开头,且变量名中不能含有“=”,其它可以随意(脚本的好处,也是脚本的坏处)。 代码:
将字符串“hello world”赋值给变量a,并输出变量a的值。 “=”左边是变量名,“=”右边是变量的值。 4.等待用户输入变量值 这一节讲的就是/p参数的常规运用。 代码:
这个代码的作用就是,等待用户输入一个时间,然后就会在指定时间关机。 前面说过“=”右边的是变量值,但是这里却不是变量值,而是提示信息,用户输入的字符串才是变量值,因为在set 中加了 /p参数! 5.set的计算功能 set的计算功能可以说是set中最繁杂的一种功能,但你不能不承认——它确实很强大。 ①.怎么进行加减乘除? 代码:
可以看出,不论进行哪一种算术运算都含有/a参数,其实不仅仅是算术运算,所有的运算都离不开/a参数。 ②.怎么求余数(取模)? 批处理中有一项专门用来求余数的运算符“%”。 在命令行下:
在批处理文件中:
可能有人会问:“为什么一个运算符,在命令行和批处理文件中会出现不同的写法呢”,其实写法还是没有变的,都是“%”,只不过%符号比较特殊,在批处理中要先进行一次转义(而%又只能用%转义),看到这里可能你还是不明白,这里可以做一个实验——实验要求:输出一个%。 在命令行下:
在批处理文件中:
③.复合算术运算符 复合运算符一共有10个,其中复合算术运算符有5个,它们分别是“+=,-=,*=,/=,%=”。 复合运算符只要使用得当,可以很好的节省代码量。 先看一个例子: 计算1-100这100个数字的和。
这个代码中Set /a n=n+%%i,第二个n的两边没有“%”,按照常规,变量在引用时,要在变量名两边加上“%”——set /a的特性就是在引用变量时,可以省略 “%”(当然你也可以不省略——但强烈建议你省略)。 用复合算术运算符简写:
对比两个代码,唯一的差别就是 n=n+%%i 与 n+=%%i。 难道n+=%%i就是 n=n+%%i的意思? 事实上也是如此,而且5个复合算术运算符都是这种意思。 “变量1 复合运算符 变量2” 就等于“变量1=变量1 对应的算术运算符 变量2”。 例如: n*=3 就是 n=n*3。 建议新手跳过第④小节的讲解,免得转的头晕。 ④.位运算符 前面讲解的运算符都是对于字节的运算,但是位运算符却是对于更小的单位——位,进行运算(1字节=8位)。 进行位运算符的学习,需要对2进制有所了解,懂得简单的 10进制 to 2进制 的相互转换,而且要对原码、反码、补码的概念有所了解。 10进制=(8位)2进制补码: 9=0000 1001 5=0000 0101 -9=1111 0111 ④.1.按位与运算符(&) 没错,它和and(echo hello & echo world)一摸一样,但是在此处它是按位与(Set /a 9^&5)。 这里,为了方便后面的教学,我们暂且将1称为真,0称为假。
为什么写成^&? 跟前面的求余数运算符是一样的道理,由于&符比较特殊,所以需要转义(%必须由%转义,&必须要^转义)。 9和5、-9和5按位与的结果分别为1,5,Why? 位运算就是要用10进制数对应的二进制补码进行运算,然后再将运算得到的二进制补码换算成10进制数输出(这是计算机本身特性决定的,不知道你还记不记的大明湖畔的夏雨荷——计算机科学的基础就是:0,1)。 9: 0000 1001 & 5: 0000 0101 --------------------- 1: 0000 0001 -9:1111 0111 & +5:0000 0101 --------------------- +5:0000 0101 按位与运算,就是“同真为真,其余为假”,在同一位上都是1运算结果才是1,其余都是0. ④.2.按位或运算符(|) “|”符号在set /a 之外还有“管道”的用法,但是在set /a 中它只是按位或(由于|符号的特殊性,在运用时也要在前面加转义符——^|)。 .
9: 0000 1001 | 5: 0000 0101 --------------------- 13: 0000 1101 -9:1111 0111 & +5:0000 0101 --------------------- -9:1111 0111 按位或运算,就是“一真便真,全假才假”,同一位上只要一个是1,那结果就是1,只有全部是0,结果才是0. 结合前面的按位与(&)运算来看,其实按位与(&)和按位或(|)就是一种比较运算,比较同一位上的0或1的异同,得出结果。 ④.3.逻辑移位 逻辑移位运算符有两个:<< ,>>,分别表示向左移位,向右移位。 向左移位(<<)
9: 0000 1001 << 2 --------------------- 36: 0010 0100 把二进制补码向左移动两位(不足的在右边补零),然后换算成10进制数得出结果(向左移是将数变大)。 语法:set /a 被移数<<移位数 计算公式:结果=被移数*(2的移位数次方) 例如:9<<2 == 9*(2的2次方) ==36 向右移位(>>)
9: 0000 1001 >> 2 --------------------- 2: 0000 0010 把二进制补码向右移动两位(多余的剔除——这里剔除了最后一个1),然后换算成10进制数得出结果(向右移是将数变小)。 语法:set /a 被移数>>移位数 计算公式:结果=被移数/(2的移位数次方) 例如:9>>2 == 9/(2的2次方) == 2 逻辑移位运算符的特性可以加以利用,来计算数值的偶数倍、偶数半: 比如 9 的 2倍,即 Set /a 9^<^<1 比如 9 的 1/2,即 Set /a 9^>^>1 ④.4.按位异或运算符(^) 按位异或运算符也是个特殊符号(转义符),所以在使用的时候也要转义(^^)。
9: 0000 1001 ^ 5: 0000 0101 --------------------- 12: 0000 1100 -9:1111 0111 ^ +5:0000 0101 --------------------- -14:1111 0010 按位异或运算,就是“不同为真,相同为假”,相同位都是1或都是0,结果就是0,其余结果都是1. ④.5.复合位运算 结合前面的复合算术运算符和位运算符,复合位运算就不难理解。 例如:(&=)运算符
结果为1。 所以,“n1^&=5”就相当于“n1=n1^&5”(“&”需要转义)。 同理,“ n1^^=5”就相当于“n1=n1^^5”;"n1^|=5"就相当于“n1=n1^|5” "n1^<^<=2"就相当于“n1=n1^<^<2”. 位运算就在这里结束了,其中“! ~ - ”这三个 “一元运算符”都没有讲解。 6.逗号运算符 如果两个变量的值都是数字,而不是字符串,就可以用set /a 中的逗号运算符一次性赋值。 例子:
结果:
如果变量值是字符串,用这种方法就会出错。 例如:
结果:
只输出了a1的值,a2没有输出,因为a2的值是字符串。 看起来像字符串的16进制数。 例如:
结果:
“0x15”中0x是16进制数前缀(等于10进制数21)。 "015"中0是8进制数前缀(等于10进制数13)。 7.替换变量中的字符串 ①.将变量中指定字符串替换成其它字符串 例如: 将字符串中的“o”替换为“-”。
结果:
②.异样替换,删除变量中的指定字符串 删除变量中的指定字符串其实就是将指定字符串替换为空值。 例如: 将字符串中的“o”删除。
结果:
字符串替换还支持通配符“*”。 例如: 将第一个字符“o”前面的字符(包括“o”)全部删除。
结果:
8.截取字符串 截取字符串就是将一个字符串中指定的部分提取出来。 例如,我要截取字符串“一二三四五六七八九十”中的“三四五”,有四种写法:
为什么这四种写法都能实现要求? 要解释会有很多种说法,我这里只能给出一句记忆口诀: 第一数,起始点。正左右,负右左。偏移! 解释第一句:“第一数,起始点。正左右,负右左。”就是“第一个数是起始点,如果是正数就从左往右数,如果是负数就从右往左数”。 以这一句为例,“Set a1=%a:~2,3%” 2是第一个数,而且是正数,所有从左往右数2个数:一二,“偏移!”就是移位。——起始点! 3是第二个数,也是正数,所有也从左往右数(从起始点开始数)3个数,三四五,“终止”!——终止点! 9.“输入光杆set,不会显示出来的”环境变量 %CD% - 扩展到当前目录字符串。 %DATE% - 用跟 DATE 命令同样的格式扩展到当前日期。 %TIME% - 用跟 TIME 命令同样的格式扩展到当前时间。 %RANDOM% - 扩展到 0 和 32767 之间的任意十进制数字。 %ERRORLEVEL% - 扩展到当前 ERRORLEVEL 数值。 %CMDEXTVERSION% - 扩展到当前命令处理器扩展版本号。 %CMDCMDLINE% - 扩展到调用命令处理器的原始命令行。 |

浙公网安备 33010602011771号