标题: [其他] [已解决]为何批处理运行结果只显示两个 %%? [打印本页]
作者: ezaohaha 时间: 2014-10-17 23:41 标题: [已解决]为何批处理运行结果只显示两个 %%?
本帖最后由 ezaohaha 于 2014-10-20 12:58 编辑
- @echo off
- set a=b&echo %%%a%%%
- pause
复制代码
为何运行后 结果显示 两个%% ?- @echo off
- set a=b&call echo %%%a%%%
- pause
复制代码
运行后就变成一个 % 咋回事呢?
作者: apang 时间: 2014-10-18 00:52
本帖最后由 apang 于 2014-10-18 00:55 编辑
set a=b&echo %%%a%%%
第一个%是对第二个%转义,脱去一个
第3个和第4个之间为引用变量的值%a%,因为没开启变量延迟,为空
第5个对第6个转义,脱去一个
所以最后为两个%
作者: ezaohaha 时间: 2014-10-18 14:52
本帖最后由 ezaohaha 于 2014-10-18 15:33 编辑
回复 2# apang [code]@echo off
好像明白了 %号转义的话 :偶数直接脱一半 奇数先替换再脱
%%%a%%% 是3个%%%(按一边算) 第一步先替换%a% 应当 替换成b 但是这是复合语句 %a% 并未赋值 所以是空 然后变成%%%% 第二步 偶数 脱一半 变成 %%
第二个 代码 加了一个call 就是 再脱一次 %% 又 变成 %
是这样理解的吗?
作者: ezaohaha 时间: 2014-10-18 15:54
回复 2# apang - @echo off
- set a=b&call call echo %%%%a%%%%
- pause
复制代码
那么这个代码是不是可以这样理解呢? %%%%a%%%% 第一次转义 变成 %%a%% 执行 call 第二次转义%a% 再次执行 call 开始给%a%赋值 赋值b (也实现了延迟环境变量扩展)。
作者: 悬崖之树 时间: 2014-10-18 17:06
本帖最后由 悬崖之树 于 2014-10-18 17:09 编辑
- set a=b
- call call echo %%%%a%%%%
复制代码
预处理是这样的:
1 将%从左到右两两配对,发现a周围没有单个的%,这样a就不作为变量,所以不替换,这样就还是复制代码
2 接着处理两次call,把%%变成单%,这样就变成了复制代码
3 替换 %a%,变成 echo b
4 最后输出 b
作者: ezaohaha 时间: 2014-10-19 12:03
回复 5# 悬崖之树
哈哈,看了你的回复,糊涂了~又看了遍教程 ,你看看是否这样理解。。。
set a=b&echo %%%%a%%%%
做预处理时 echo %%%a%%%匹配成 echo %%a%% 最后输出在屏幕上是 %%a%%
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |