Board logo

标题: [其他] [已解决]为何批处理运行结果只显示两个 %%? [打印本页]

作者: ezaohaha    时间: 2014-10-17 23:41     标题: [已解决]为何批处理运行结果只显示两个 %%?

本帖最后由 ezaohaha 于 2014-10-20 12:58 编辑
  1. @echo off
  2. set a=b&echo %%%a%%%
  3. pause
复制代码
为何运行后 结果显示 两个%% ?
  1. @echo off
  2. set a=b&call echo %%%a%%%
  3. 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
  1. @echo off
  2.     set a=b&call call echo  %%%%a%%%%
  3.     pause
复制代码
那么这个代码是不是可以这样理解呢?  %%%%a%%%% 第一次转义 变成 %%a%% 执行 call  第二次转义%a% 再次执行 call  开始给%a%赋值 赋值b (也实现了延迟环境变量扩展)。
作者: 悬崖之树    时间: 2014-10-18 17:06

本帖最后由 悬崖之树 于 2014-10-18 17:09 编辑
  1. set a=b
  2. call call echo %%%%a%%%%
复制代码
预处理是这样的:
1 将%从左到右两两配对,发现a周围没有单个的%,这样a就不作为变量,所以不替换,这样就还是
  1. call call echo %%%%a%%%%
复制代码
2 接着处理两次call,把%%变成单%,这样就变成了
  1. echo %a%
复制代码
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