中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]为什么变量转义字符%%会只显示一个%
作者:
标题: [已结]为什么变量转义字符%%会只显示一个% 上一主题 | 下一主题
bagpipe
银牌会员

DOS联盟捡破烂的


积分 1144
发帖 425
注册 2005-10-20
来自 北京
状态 离线
『楼 主』:  [已结]为什么变量转义字符%%会只显示一个%

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

[ Last edited by willsort on 2006-6-8 at 12:34 ]

   此帖被 -8 点积分      点击查看详情   


2006-2-11 10:55
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子
JonePeng
金牌会员

D◎$ Fαп


积分 4562
发帖 1883
注册 2004-1-19
来自 广东广州
状态 离线
『第 2 楼』:  

在命令行中就用一个%,批处理中就用两个%。不仅是echo命令,连 for 命令的 %i 在批处理文件中都要写成 %%i。



----====≡≡≡≡ 我的至爱,永远是MSDOS!≡≡≡≡====----
  
2006-2-11 15:15
查看资料  发送邮件  发短消息 网志  OICQ (373343541)  编辑帖子
bagpipe
银牌会员

DOS联盟捡破烂的


积分 1144
发帖 425
注册 2005-10-20
来自 北京
状态 离线
『第 3 楼』:  

我想JonePeng兄弟误会我的意思了,呵呵,批处理中FOR 语句必须要用%%I这样的形式,我还是举个例子比较好,首先要谢谢JonePeng兄弟能够帮助我,下面看例子:

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

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

2006-2-12 08:55
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 4 楼』:  


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

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 ]



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-2-12 09:21
查看资料  发送邮件  发短消息 网志   编辑帖子
bagpipe
银牌会员

DOS联盟捡破烂的


积分 1144
发帖 425
注册 2005-10-20
来自 北京
状态 离线
『第 5 楼』:  

谢谢WILLSORT版主的回复,似乎有些明白了,谢谢二位对我的帮助,大家一起努力才是,再次说声谢谢!

2006-2-12 12:19
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子
jun19841
初级用户





积分 55
发帖 29
注册 2006-4-11
来自 亚洲
状态 离线
『第 6 楼』:  

哇噻 · ···································   
^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈

2006-6-1 01:19
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (251101015)  编辑帖子
chineselgs
高级用户

论坛灌水专业户


积分 613
发帖 266
注册 2006-4-19
来自 河南省
状态 离线
『第 7 楼』:  

楼上的是个疯子啊??



饮马恒河畔,剑指天山西,碎叶城揽月,库叶岛赏雪,黑海之滨垂钓,贝尔加湖面张弓;中南半岛访古,东京废墟祭祖!
  
2006-6-4 16:25
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (342210799)  编辑帖子
不得不爱
超级版主

我爱DOS


积分 5310
发帖 2044
注册 2005-9-26
来自 四川南充
状态 离线
『第 8 楼』:  

───────────────── 版务记录 ─────────────────
执行:qwe1234567
操作:移动主题:自DOS學習入門 & 精彩文章 (教學室)
说明:根据willsort的建议、依照主题内容分类,更适合于发表在此版区
处罚:暂不!
───────────────── 版务记录 ─────────────────




我的网络U盘 我的网络第2个U盘
论坛软件下载链接
灵雨飘零论坛  
论坛新手必读,所有人的基本行为准则
刷QQ空间人气、留言的小软件
2006-6-6 09:47
查看资料  发送邮件  发短消息 网志   编辑帖子
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 9 楼』:  


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



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




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-6-8 12:32
查看资料  发送邮件  发短消息 网志   编辑帖子
zhangxue
初级用户





积分 183
发帖 82
注册 2006-3-28
状态 离线
『第 10 楼』:  

请教(ms-dos环境下):
如果
%a%=b
%b%=2
那么如何将a和2关联起来?发现%%a%%并不等于2

2006-6-8 14:37
查看资料  发短消息 网志   编辑帖子
kcdsw
中级用户





积分 404
发帖 179
注册 2006-3-30
状态 离线
『第 11 楼』:  

echo %%%%~f0

2006-6-9 09:38
查看资料  发短消息 网志   编辑帖子
mysuntjy
新手上路





积分 13
发帖 10
注册 2008-11-13
来自 重庆市
状态 离线
『第 12 楼』:  



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

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

2008-12-23 22:57
查看资料  发送邮件  发短消息 网志   编辑帖子

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: