先看代码:
1.- @echo off
- echo %num%
- pause
复制代码 2.- @echo off
- echo ^^num^^
- pause
复制代码 3.- @echo off
- echo %%num%%
- pause
复制代码 4.- @echo off
- echo %%num^^
- pause
复制代码 5.- @echo off
- echo ^%num^^
- pause
复制代码 6.- @echo off
- echo ^%num^%
- pause
复制代码 上面六段代码显示效果都不一样。1因为num未定义显示echo的关闭状态,好理解,2、3、4因为变量两边的特殊字符的第一个都用作转义,也好理解。问题是5、6段代码,5显示结果为“num^”,为什么前面的^%就没有任何显示呢?我试过如果将代码5的echo ^%num^^改成echo ^%的话,运行以后窗口一闪就没了,为什么会这样呢?至于代码6,也是运行以后窗口一闪就没了。麻烦论坛的达人给解释一下,多谢。
经论坛各位达人指教后得出结论,整理如下:
1、^身兼两重重任:当它不位于行尾的时候,它起到转义字符的作用,也就是取消紧跟在它之后的那个字符的特殊用法,化特殊字符为普通字符,比如|、>、&,在转义的时候,它本身也会消失,而不论是否对后面的字符做了转义,所以如果要显示^本身的时候,需要写成 echo ^^ ;当它位于命令行的尾部时,它将起到连字符的作用,也就是把下一行的字符与它所在的那一行相连,视为同一行处理,就像随风在2楼所举例的那样;
2、%也扮演双重角色——转义%或引用变量:如果要在命令行中显示%本身的话,需要用连续两个百分号来表示,写成 echo %%;单独的%会被认为在做变量引用,在预处理阶段的时候,CMD.EXE解释器会对单独的百分号做表分号对匹配,搜索是否有在同一行上的另外一个百分号和它配对,如果有的话,就认为是在做变量引用,如果没有的话,这个百分号将会被丢弃,所以,echo ^%num^^ 的结果是显示 num^;
3、CMD.EXE在做预处理的时候,如果^和%同时存在,将先做%的变量引用匹配,再对引用结果做^转义,也就是说,%的优先级高于^;
综合以上三点,当 echo ^%num^% 的时候,先对百分号对里的变量做引用,因为 num^ 这个变量没有被定义,所以值为空,echo ^%num^% 也就相当于执行了 echo ^ 这个命令;又因为此时 ^ 已经位于行尾,所以,它不是起转义字符的作用,而是起连接上下两行的连字符作用,在执行第6个代码的时候,整个代码的意思就是在 echo pause ,此时的 pause 是 echo 的对象,而不是单独的一条命令,在第6个代码的下一行再加一条 pause 语句就可以看出来了。
另外,在两个各百分号之间的的特殊字符不会当作特殊字符处理,而是当作组成变量名的普通字符来处理,如:- @echo off
- set num^^=2009
- set num=09
- echo ^%num^^%
- pause
- pause
复制代码 显示结果为pause。
所以要显示变量num^^的值,必须在%%之间写成num^。上段代码因为中间写了两个^致使num^^被识别为未定义字符,故echo ^%num^^%被解释成echo ^,^做连字符处理连接pause。
至此,水落石出,尘埃落定。多谢所有前辈指点迷津。
新手也不用逐楼攀爬了。
无量公德……
[ 本帖最后由 Lumiere 于 2009-3-24 10:36 编辑 ] |