Board logo

标题: 批处理逃逸字符%的详细解释 [打印本页]

作者: 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

  1. @echo off
  2. if exist inf.txt del inf.txt>nul
  3. set /p a=a:
  4. set /p b=b:
  5. set /p c=C:
  6. for %%i in (a b c) do echo %%i=%%%%i >>inf.txt
复制代码

原来如此,那我这个有什么办法可以实现呢?
作者: cui1988wei    时间: 2010-9-16 18:18     标题: 回复 14楼 的帖子

  1. @echo off
  2. if exist inf.txt del inf.txt>nul
  3. set  /p a=a:
  4. set  /p b=b:
  5. set  /p c=c:
  6. for %%i in (%a% %b% %c%) do (
  7.             echo %%i=%%%%i
  8.             echo %%i=%%%%i>>inf.txt)
  9. pause
复制代码

[ 本帖最后由 cui1988wei 于 2010-9-16 18:20 编辑 ]
作者: xiapeng01    时间: 2010-9-24 15:34

貌似多了两个%,改成下面的就可以了:
  1. @echo off
  2. if exist inf.txt del inf.txt>nul
  3. set  /p a=a:
  4. set  /p b=b:
  5. set  /p c=c:
  6. for %%i in (%a% %b% %c%) do (
  7.             echo %%i=%%i
  8.             echo %%i=%%i>>inf.txt)
  9. pause
复制代码

作者: wc726842270    时间: 2010-9-24 16:17

非常的经典,一开始我也是没看明白,后来存入手机电子书中,学P一段时间后才明白的。其实是看了N遍




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2