标题: 批处理逃逸字符%的详细解释 [打印本页]
作者: youxi01 时间: 2008-1-6 21:38 标题: 批处理逃逸字符%的详细解释
1、%是个ESCAPE字符,通常将之译为转义字符,但也有更形象的译名脱逸字符、逃逸字符等。也就是说%不仅仅将与其相关的特定字符串转义并替换为特定字符串,而且自身也会被“脱逸”。而且类似于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中的环境变量不再是常量了。
作者: godzza 时间: 2008-1-27 10:18
那如果我要在p处理显示%tmp%的话要怎么弄才行呢?
谢谢解答
作者: plp626 时间: 2008-1-27 17:57
echo %%tmp%%
作者: zyc411277063 时间: 2008-11-2 22:42
不是很明白,貌似专业词语有点多。。。
作者: kennybao 时间: 2008-11-15 13:16
有点难理解,能提供 示例代码就更好了。
作者: asli33 时间: 2008-11-24 23:22
对啊,结合实例理解起来更容易一些
作者: 5810239q 时间: 2009-3-29 11:46
很不好理解,看了好几遍
作者: gxuan2008 时间: 2010-1-21 00:30
看了两遍还是不怎么明白,系统变量的%算不算逃逸字符呢?
如果算的话,拿%date%来说,%号的作用是不是将date转换成当前日期字符串(也就是版主说的:将与其相关的特定字符串转义并替换为特定字符串),然后%不显示。但这个是不是只针对变量来说。因为
echo %aaa%
pause
显示结果为:echo 为打开状态。可不可以这样理解当两%号之间不为变量或特殊字符的时候,%之间的内容就会一起脱逸,反之%%之间为可以转义的变量字符时就会实行转义。
作者: BatCoder 时间: 2010-1-21 00:51 标题: 回复 8楼 的帖子
你的例子里面,aaa同样是一个变量,只不过这个变量没有被定义过,预处理的时候它被替换成空值了。
作者: q1x2x3 时间: 2010-1-22 14:21
很好理解。。%还有个用处%1 %0 %2
先说%0吧,这个其实就是指文件本身,也就是你写的那个批处理
%1是指首次输入。。。官方好像是这样说的,其实很简单就是把文件拖到你的批处理上,%1指的就是那个被拖过去的文件
%2。。这个很无聊和1差不多只不过你要同时拖2个过去,貌似%2指的是靠左边下面的,他好像是按照从左至右从上到下那么算的
%3 %4 %5都以此类推
作者: rivch 时间: 2010-5-15 19:28 标题: 回复 10楼 的帖子
%0理解了,但是后面的是怎么回事啊——#
%1不是批处理里引用的第一个变量吗?
还有 %2指的是靠左边下面的,他好像是按照从左至右从上到下那么算的
这句什么意思。。。。。
求解释!
作者: chuxian03 时间: 2010-5-24 16:34
脱逸什么意思????
作者: 523066680 时间: 2010-5-24 20:29
其实是英文解释 escape
从字面上看去 是逃脱的意思。
在这里是表示转义的
谷歌翻译其中一个说:"换码"
作者: xiapeng01 时间: 2010-7-14 17:51
- @echo off
- if exist inf.txt del inf.txt>nul
- set /p a=a:
- set /p b=b:
- set /p c=C:
- for %%i in (a b c) do echo %%i=%%%%i >>inf.txt
复制代码
原来如此,那我这个有什么办法可以实现呢?
作者: cui1988wei 时间: 2010-9-16 18:18 标题: 回复 14楼 的帖子
- @echo off
- if exist inf.txt del inf.txt>nul
- set /p a=a:
- set /p b=b:
- set /p c=c:
- for %%i in (%a% %b% %c%) do (
- echo %%i=%%%%i
- echo %%i=%%%%i>>inf.txt)
- pause
复制代码
[ 本帖最后由 cui1988wei 于 2010-9-16 18:20 编辑 ]
作者: xiapeng01 时间: 2010-9-24 15:34
貌似多了两个%,改成下面的就可以了:- @echo off
- if exist inf.txt del inf.txt>nul
- set /p a=a:
- set /p b=b:
- set /p c=c:
- for %%i in (%a% %b% %c%) do (
- echo %%i=%%i
- echo %%i=%%i>>inf.txt)
- pause
复制代码
作者: wc726842270 时间: 2010-9-24 16:17
非常的经典,一开始我也是没看明白,后来存入手机电子书中,学P一段时间后才明白的。其实是看了N遍
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |