此节是将要显示的签名串逆序保存到环境变量中。变量名","的使用在这里有多重含义,除了“两个尽量”的原则外,它还作为 set 与其参数的分隔符,这又是命令行灵活性的例证了——既允许变量名使用非字母数字的字符,又允许这个字符做其它解释。与此异曲同工的还有上面提到的 cmd/c 中“/”,以及“=”“;”等许多字符,这我在旧帖中曾有论述,不太好找了,有兴趣的可以自己多用 cmd 加一些特殊字符来尝试。
签名串逆序的目的自然又是“尽量晦涩难懂”,这与后面 for 中的 (22;-1;0) 相呼应。
签名串前后的两个特殊字符,就是 ASCII 字符集中的响铃符,其 ASCII 码为07,属于 ASCII 码表中的控制区字符。因控制区字符大多有特殊含义,故使用“记事本”很难输入这个字符,可以使用 DOS 下的编辑器 EDIT,届时先键入 Ctrl+P 开启控制字符显示(即暂时关闭其转义特性),再键入 Ctrl+G (提示:G在字母表中的顺序是7,详细内容请参阅网络上 ASCII 码表的相关信息)即可得到这个字符,当然也可使用 UltraEdit 这类十六进制编辑器,直接键入其 ASCII 代码来输入它。因为 ASCII 控制区字符的显示字形并无统一约定,因此它在命令行环境下看起来像一个圆点,而大多数 Windows 的字体不再能正常显示它。但又因 ASCII 标准被吸收为 Unicode 标准中的一个基本平面,因此支持 Unicode 的 NT 系统仍会正确识别并解释这个在旧 DOS 时代就风靡一时的特殊字符。
3、&for,/l,%i,in,(22,-1,0)do,
“&”是命令分隔符,用来分隔一个命令行中的多个命令。Cmd.exe 运行第一个命令,然后运行第二个命令。因为“&”有连接多个命令的功能,所以也称为“命令连接符”。set 是它所连接的第一个命令,for 是第二个命令。需要注意的是,其后的 ping 语句前也存在一个“&”,虽然同是命令分隔符,却分属不同层级,前者分隔 %ComSpec% /c 中的 set 与 for,后者分隔 for 中的 call 与 ping。同类的分隔符还有|,&&,||等,详细内容请查阅Windows帮助“命令提示符”一节。
以后为 for 的前半节,属于 for 循环的控制部分,实现一个从22到0的逆序循环,替换变量为%i,将在以后的循环体语句块中出现,并被替换为自 22 到 0 这 23 个数字串;详细内容可以在命令行环境中使用 for /? 查阅到。(22,-1,0) 之外的其余逗号都可替换为空格,也可以替换为其它可用的参数分隔符(比如“;”“=”等,注意与命令分隔符的区别),如此使用仍然是“尽量晦涩难懂”的体现。
4、@call,set/p= %,:~%i,1%<nul
这是 for 语句块中的第一句代码,目的是根据替换变量 %i 从环境变量 %,% 中取出对应的字符,结合 for 的控制部分,即实现了签名串的逆序逐字显示。@的作用在于禁止其后的 call 语句在命令行中回显,因为 for 语句会创建一个新的命令运行环境来执行循环体中的多条语句,而在这个新环境中命令行回显是开启的。而 call 则实现了命令行转义字符 % 的二次替换:在 for 创建的新环境中依次替换 %i 为 22 到 0 这 23 个数字,在 call 再次创建的新环境中依次再替换 %,:~22,1% 至 %,:~0,1% 为签名串中的每个字符。