Re bagpipe:
关于 set /a 操作符,它们全部脱胎于C语系,想要深入了解它,找一本讲解C语言的书翻阅关于操作符的篇章即可。
关于^和%的问题,实际上它们都具有“逃逸”的特性,也就是说它们在对紧随其后的串进行转义的同时,自身也会被删除,比如你在echo连续的四个^时,实际上只会输出两个^。
在CMD命令行中,“^”的作用是将其后的单个字符字符化,也就是取消类似><|^%这些字符的转义功能,而将它转变为一个具有普通输入输出意义的字符;“%”的作用是将其后的单个字符或者字符串变量化,也即将字符串替换为程序中预先定义好的变量值,它包括命令行参数、环境变量、FOR替换变量。另外,成对的双引号"会将其中包括的命令行串字符化,与此类似的,成对的%会将会将其中命令行串的变量化。
虽然在set/a中%和^又被赋予了另外的数学意义,但是在cmd命令行中,它们的意义仍然不变,所以我们只需要负责传递给set/a一个具有普通意义的表达式字符串即可,至于其中的变量和操作符分析,则一概有set/a独立负责,与CMD命令行无关。而要实现表达式字符串的传递,我们就必须使用一些类似双写的“保护措施”来通过CMD命令行的“逃逸剥削”。
下面的代码范例应该可以更好的说明一些问题。由此代码,我们尚可观察出转义功能符的优先级,即% 大于 " 大于 ^ ,也即^和"不会将%字符化,而^也不会使"的字符化功能丧失。
@echo off
set /a t1=1^3
echo "%t1%=1^3"
:: t1值为13,因为单个^在cmd中被脱去,其后3被字符化,与1构成字符串13,在set/a中被解析为数字
set /a t2=1^^3
echo "%t2%=1^^3"
:: t2值为2,因为双个^在cmd中被脱为单个^,在set/a中被解析为异或操作符,其数学意义结果即2
set /a t3=5%3
echo "%t3%=5%3"
:: t3值为1,因为单个%在cmd中被脱去,其后3被解析为第三命令行参数,在无参数调用时被替换为空
set /a t4=5%%3
echo "%t4%=5%%3"
:: t3值为2,因为双个%在cmd中被脱为单个%,在set/a中被解析为取余操作符,其数学意义结果即2
Last edited by willsort on 2006-5-11 at 17:19 ]