中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-14 20:57
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]为什么变量转义字符%%会只显示一个%
楼 主 [已结]为什么变量转义字符%%会只显示一个% 发表于 2006-02-11 10:55 ·  中国 北京 顺义区 联通
银牌会员
★★★
DOS联盟捡破烂的
积分 1,144
发帖 425
注册 2005-10-20 00:00
UID 43784
来自 北京
状态 离线
用ECHO命令显示“ %~dpI”问题,为什么编写批处理的时候必须用ECHO %%~dpI语句才能显示出“ %~dpI”这个呢?为什么用回显命令执行的时候只显示一个呢?偶没有查到有关资料,请WILLSORT和无奈何老兄帮忙解决一下,这个先谢谢你们了。

[ Last edited by willsort on 2006-6-8 at 12:34 ]
2 发表于 2006-02-11 15:15 ·  中国 广东 广州 天河区 电信
金牌会员
★★★★
D◎$ Fαп
积分 4,562
发帖 1,883
注册 2004-01-19 00:00
UID 15812
性别 男
来自 广东广州
状态 离线
在命令行中就用一个%,批处理中就用两个%。不仅是echo命令,连 for 命令的 %i 在批处理文件中都要写成 %%i。
----====≡≡≡≡ 我的至爱,永远是MSDOS!≡≡≡≡====----
3 发表于 2006-02-12 08:55 ·  中国 北京 顺义区 联通
银牌会员
★★★
DOS联盟捡破烂的
积分 1,144
发帖 425
注册 2005-10-20 00:00
UID 43784
来自 北京
状态 离线
我想JonePeng兄弟误会我的意思了,呵呵,批处理中FOR 语句必须要用%%I这样的形式,我还是举个例子比较好,首先要谢谢JonePeng兄弟能够帮助我,下面看例子:

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

这个批处理中第一个ECHO产生的结果是这个批处理文件的完整路径,第二个ECHO显示的是“%~f0”这个字符,我现在就是不明白的是为什么有两个%%,用ECHO显示的时候变成了一个%???
4 发表于 2006-02-12 09:21 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线

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

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:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
5 发表于 2006-02-12 12:19 ·  中国 北京 顺义区 联通
银牌会员
★★★
DOS联盟捡破烂的
积分 1,144
发帖 425
注册 2005-10-20 00:00
UID 43784
来自 北京
状态 离线
谢谢WILLSORT版主的回复,似乎有些明白了,谢谢二位对我的帮助,大家一起努力才是,再次说声谢谢!
6 发表于 2006-06-01 01:19 ·  中国 江西 南昌 电信
初级用户
积分 55
发帖 29
注册 2006-04-11 16:40
UID 53669
性别 男
来自 亚洲
状态 离线
哇噻 · ···································
^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈 ^哈 哈
7 发表于 2006-06-04 16:25 ·  中国 福建 泉州 电信
高级用户
★★
论坛灌水专业户
积分 613
发帖 266
注册 2006-04-19 22:47
UID 54113
来自 河南省
状态 离线
楼上的是个疯子啊??
饮马恒河畔,剑指天山西,碎叶城揽月,库叶岛赏雪,黑海之滨垂钓,贝尔加湖面张弓;中南半岛访古,东京废墟祭祖!
8 发表于 2006-06-06 09:47 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
UID 42843
性别 男
来自 四川南充
状态 离线
───────────────── 版务记录 ─────────────────
执行:qwe1234567
操作:移动主题:自DOS學習入門 & 精彩文章 (教學室)
说明:根据willsort的建议、依照主题内容分类,更适合于发表在此版区
处罚:暂不!
───────────────── 版务记录 ─────────────────
9 发表于 2006-06-08 12:32 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线

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



───────────────── 版务记录 ─────────────────
执行:Will Sort
操作:移动主题:自《DOS疑難解答 & 問題討論(解答室)》
说明:本主题符合新成立的版区分划原则,且讨论已暂告结束
───────────────── 版务记录 ─────────────────
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
10 发表于 2006-06-08 14:37 ·  中国 广东 清远 联通
初级用户
★★
积分 183
发帖 82
注册 2006-03-28 21:18
UID 52959
状态 离线
请教(ms-dos环境下):
如果
%a%=b
%b%=2
那么如何将a和2关联起来?发现%%a%%并不等于2
11 发表于 2006-06-09 09:38 ·  中国 北京 鹏博士BGP
中级用户
★★
积分 404
发帖 179
注册 2006-03-30 14:44
UID 53056
状态 离线
echo %%%%~f0
12 发表于 2008-12-23 22:57 ·  中国 重庆 沙坪坝区 电信
新手上路
积分 13
发帖 10
注册 2008-11-13 00:09
UID 130805
性别 男
来自 重庆市
状态 离线
Originally posted by zhangxue at 2006-6-8 14:37:
请教(ms-dos环境下):
如果
%a%=b
%b%=2
那么如何将a和2关联起来?发现%%a%%并不等于2

在命令行中用:call,echo %%a%%即可.
论坛跳转: