Board logo

标题: [已结]为什么变量转义字符%%会只显示一个% [打印本页]

作者: bagpipe     时间: 2006-2-11 10:55    标题: [已结]为什么变量转义字符%%会只显示一个%

用ECHO命令显示“ %~dpI”问题,为什么编写批处理的时候必须用ECHO  %%~dpI语句才能显示出“ %~dpI”这个呢?为什么用回显命令执行的时候只显示一个呢?偶没有查到有关资料,请WILLSORT和无奈何老兄帮忙解决一下,这个先谢谢你们了。

[ Last edited by willsort on 2006-6-8 at 12:34 ]
作者: JonePeng     时间: 2006-2-11 15:15
在命令行中就用一个%,批处理中就用两个%。不仅是echo命令,连 for 命令的 %i 在批处理文件中都要写成 %%i。
作者: bagpipe     时间: 2006-2-12 08:55
我想JonePeng兄弟误会我的意思了,呵呵,批处理中FOR 语句必须要用%%I这样的形式,我还是举个例子比较好,首先要谢谢JonePeng兄弟能够帮助我,下面看例子:

@echo off
echo %~f0
echo %%~f0

这个批处理中第一个ECHO产生的结果是这个批处理文件的完整路径,第二个ECHO显示的是“%~f0”这个字符,我现在就是不明白的是为什么有两个%%,用ECHO显示的时候变成了一个%???
作者: willsort     时间: 2006-2-12 09:21

───────────────── 版主提示 ─────────────────
为了方便论坛用户浏览和版主管理,请修改该主题的标题,以简要叙述主题的内容或意图
此主题最好发表在“解答室”,因为此主题在分类上更接近疑难问答
───────────────── 版主提示 ─────────────────

Re bagpipe:

      你的问题与两个要素有关:

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

[ Last edited by willsort on 2006-2-12 at 09:57 ]
作者: bagpipe     时间: 2006-2-12 12:19
谢谢WILLSORT版主的回复,似乎有些明白了,谢谢二位对我的帮助,大家一起努力才是,再次说声谢谢!
作者: jun19841     时间: 2006-6-1 01:19
哇噻 · ···································   
^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈
作者: chineselgs     时间: 2006-6-4 16:25
楼上的是个疯子啊??
作者: 不得不爱     时间: 2006-6-6 09:47
───────────────── 版务记录 ─────────────────
执行:qwe1234567
操作:移动主题:自DOS學習入門 & 精彩文章 (教學室)
说明:根据willsort的建议、依照主题内容分类,更适合于发表在此版区
处罚:暂不!
───────────────── 版务记录 ─────────────────

作者: willsort     时间: 2006-6-8 12:32

───────────────── 版务记录 ─────────────────
执行:Will Sort
操作:修改标题 - 偶有个问题,请willsort版主帮忙解决一下,谢谢
说明:原主题作者在通知发出三日后仍未申诉或修改,由版主修改并进行处罚
处罚:扣除因发表该主题而奖励的6点积分,扣除标题违规惩罚性2点积分
───────────────── 版务记录 ─────────────────



───────────────── 版务记录 ─────────────────
执行:Will Sort
操作:移动主题:自《DOS疑難解答 & 問題討論(解答室)》
说明:本主题符合新成立的版区分划原则,且讨论已暂告结束
───────────────── 版务记录 ─────────────────

作者: zhangxue     时间: 2006-6-8 14:37
请教(ms-dos环境下):
如果
%a%=b
%b%=2
那么如何将a和2关联起来?发现%%a%%并不等于2
作者: kcdsw     时间: 2006-6-9 09:38
echo %%%%~f0
作者: mysuntjy     时间: 2008-12-23 22:57


  Quote:
Originally posted by zhangxue at 2006-6-8 14:37:
请教(ms-dos环境下):
如果
%a%=b
%b%=2
那么如何将a和2关联起来?发现%%a%%并不等于2

在命令行中用:call,echo %%a%%即可.