特定字符串,而且自身也会被“脱逸”。而且类似于C语言中的转义字符\,双%会转义并脱逸为单%,四%则脱为双%。
2、for本身是一个特殊的命令,类似于一个特化的命令解释器,因为它的功能实现需要执行多条语句,因此它必须也具有对命令行(特指do后的命令行)分析处理的功能。而command/cmd实现for时自然会借用自身原有的命令行分析模块,因此for具有二级转义的特性,for中do后的语句被分两级分析和解释,第一级在command/cmd读入并解释for命令行时,第二级在for读入并解释do命令时,它通常会对同一命令行的进行多次解释。
然后,我们可以注意到,在do中使用命令行参数变量和环境变量时,不需要双%,那是因为,这些变量在经过第一级转义后,被替换成特定的不变的字符串常量,参与for循环的所有执行过程;而替代变量则要求在执行(do后的子命令行中)过程中不断的动态变化,而这个变化自然仍需要通过脱逸字符来实现,因此使用双%就是成了必然的选择。
另外,还需要注意到,在命令行中使用for时不需要双%,这源于命令解释器对命令行与批处理的处理方式不同。在早期的DOS版本中,%在命令行中不被视为转义字符,所以不会被转义和脱逸,所以当时无法在命令行直接引用环境变量。而使用for时,只需要一个%供for进行转义和脱逸就够了。在以后的命令解释器版本中,加入了命令行转义的支持(主要是环境变量的支持),但命令行for使用单%的传统仍然保留了下来。
而cmd中的变量延迟替换是属于特殊的情况,但不违背以上的转义原则,只是for中的环境变量不再是常量了。
除了for循环变量外,批处理变量的脱逸符要成对使用,就像数学四则运算的括号一样。
call set b=%%a:~0,%c%%%
最里面一对单%相当于四则运算里的小括号,外面的一对双%相当于中括号,再有3 个%就相当于大括号。
48.位运算符
位运算符是对于更小的单位——位,进行运算(1字节=8位)。 进行位运算符的学习,需要对2进制有所了解,懂得简单的 10进制 to 2进制 的相互转换,而且要对原码、反码、补码的概念有所了解。
10进制=(8位)2进制补码: 9=0000 1001 5=0000 0101 -9=1111 0111
1.按位与 运算符(&)
这里,为了方便后面的教学,我们暂且将1称为真,0称为假。
C:\\Users\\helloworld\\Desktop>set /a 9^&5 1
C:\\Users\\helloworld\\Desktop>set /a -9^&5 5
为什么写成^&?
跟前面的求余数运算符是一样的道理,由于&符比较特殊,所以需要转义(%必须由%转义,&必须要^转义)。
9和5、-9和5按位与的结果分别为1,5,Why?
位运算就是要用10进制数对应的二进制补码进行运算,然后再将运算得到的二进制补码换算成10进制数输出。 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 中它只是按位或(由于|符号的特殊性,在运用时也要在前面加转义符——^|)。 C:\\Users\\helloworld>set /a 5^|9 13
C:\\Users\\helloworld>set /a 5^|-9 -9
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.逻辑移位
逻辑移位运算符有两个:<< ,>>,分别表示向左移位,向右移位。
向左移位(<<)
C:\\Users\\helloworld\\Desktop>set /a 9^<^<2 36
9: 0000 1001 << 2
--------------------- 36: 0010 0100
把二进制补码向左移动两位(不足的在右边补零),然后换算成10进制数得出结果(向左移是将数变大)。
语法:set /a 被移数<<移位数
计算公式:结果=被移数*(2的移位数次方) 例如:9<<2 == 9*(2的2次方) ==36
向右移位(>>)
C:\\Users\\helloworld\\Desktop>set /a 9^>^>2 2
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.按位异或运算符(^)
按位异或运算符也是个特殊符号(转义符),所以在使用的时候也要转义(^^)。 C:\\Users\\helloworld\\Desktop>Set /a 9^^5 12
C:\\Users\\helloworld\\Desktop>Set /a -9^^5 -14
9: 0000 1001 ^
5: 0000 0101 --------------------- 12: 0000 1100
-9:1111 0111 ^
+5:0000 0101 --------------------- -14:1111 0010
按位异或运算,就是“不同为真,相同为假”,相同位都是1或都是0,结果就是0,其余结果都是1.
5.复合位运算
结合前面的复合算术运算符和位运算符,复合位运算就不难理解。 例如:(&=)运算符 @echo off Set n1=9
Set /a n1^&=5 echo %n1% pause
结果为1。
所以,“n1^&=5”就相当于“n1=n1^&5”(“&”需要转义)。
同理,“ n1^^=5”就相当于“n1=n1^^5”;\就相当于“n1=n1^|5” \就相当于“n1=n1^<^<2”.
位运算就在这里结束了,其中“! ~ - ”这三个 “一元运算符”都没有讲解。
6.逗号运算符
如果两个变量的值都是数字,而不是字符串,就可以用set /a 中的逗号运算符一次性赋值。 例子: @echo off
Set /a a1=5,a2=5 echo ?% ¢% pause
结果: 5 5
如果变量值是字符串,用这种方法就会出错。 例如: @echo off
Set /a a1=5,a2=5a echo ?% ¢% pause
结果:无效数字。数字常数只能是十进制(17),十六位进制(0x11)或八进制(021)。 5
只输出了a1的值,a2没有输出,因为a2的值是字符串。
看起来像字符串的16进制数。 例如: @echo off
Set /a a1=5,a2=0x15 echo ?% ¢% pause
结果: 5 21
“0x15”中0x是16进制数前缀(等于10进制数21)。 \中0是8进制数前缀(等于10进制数13)。
49.reg
例子:
增加系统启动项(一般是把文件拖到开始菜单——程序——启动,实现开机自启动;删除开机启动一般是在 msconfig /4 中设置)
@echo off
echo 修改系统启动项
set /p girl=输入要添加的程序的名称: