[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

批处理逃逸字符%的详细解释

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中的环境变量不再是常量了。

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

TOP

貌似多了两个%,改成下面的就可以了:
  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
复制代码

TOP

回复 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 编辑 ]

TOP

  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
复制代码

原来如此,那我这个有什么办法可以实现呢?

TOP

其实是英文解释 escape  
从字面上看去 是逃脱的意思。
在这里是表示转义的

谷歌翻译其中一个说:"换码"

TOP

脱逸什么意思????

TOP

回复 10楼 的帖子

%0理解了,但是后面的是怎么回事啊——#
%1不是批处理里引用的第一个变量吗?
还有 %2指的是靠左边下面的,他好像是按照从左至右从上到下那么算的
这句什么意思。。。。。
求解释!

TOP

很好理解。。%还有个用处%1     %0     %2
先说%0吧,这个其实就是指文件本身,也就是你写的那个批处理
%1是指首次输入。。。官方好像是这样说的,其实很简单就是把文件拖到你的批处理上,%1指的就是那个被拖过去的文件
%2。。这个很无聊和1差不多只不过你要同时拖2个过去,貌似%2指的是靠左边下面的,他好像是按照从左至右从上到下那么算的
%3 %4 %5都以此类推

TOP

回复 8楼 的帖子

你的例子里面,aaa同样是一个变量,只不过这个变量没有被定义过,预处理的时候它被替换成空值了。
Do All in Command Line

TOP

看了两遍还是不怎么明白,系统变量的%算不算逃逸字符呢?
如果算的话,拿%date%来说,%号的作用是不是将date转换成当前日期字符串(也就是版主说的:将与其相关的特定字符串转义并替换为特定字符串),然后%不显示。但这个是不是只针对变量来说。因为
echo %aaa%
pause
显示结果为:echo 为打开状态。可不可以这样理解当两%号之间不为变量或特殊字符的时候,%之间的内容就会一起脱逸,反之%%之间为可以转义的变量字符时就会实行转义。

TOP

很不好理解,看了好几遍

TOP

对啊,结合实例理解起来更容易一些

TOP

有点难理解,能提供 示例代码就更好了。

TOP

不是很明白,貌似专业词语有点多。。。

TOP

返回列表