[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] [已解决]为何批处理运行结果只显示两个 %%?

本帖最后由 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
复制代码
运行后就变成一个 %  咋回事呢?
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 5# 悬崖之树
哈哈,看了你的回复,糊涂了~又看了遍教程 ,你看看是否这样理解。。。
set a=b&echo %%%%a%%%%
做预处理时 echo %%%a%%%匹配成 echo %%a%% 最后输出在屏幕上是 %%a%%

TOP

本帖最后由 悬崖之树 于 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
1

评分人数

时光荏苒||新陈代谢&&涛声依旧||本性难移

TOP

回复 2# apang
  1. @echo off
  2.     set a=b&call call echo  %%%%a%%%%
  3.     pause
复制代码
那么这个代码是不是可以这样理解呢?  %%%%a%%%% 第一次转义 变成 %%a%% 执行 call  第二次转义%a% 再次执行 call  开始给%a%赋值 赋值b (也实现了延迟环境变量扩展)。

TOP

本帖最后由 ezaohaha 于 2014-10-18 15:33 编辑

回复 2# apang [code]@echo off
好像明白了 %号转义的话 :偶数直接脱一半  奇数先替换再脱  
%%%a%%%  是3个%%%(按一边算) 第一步先替换%a% 应当 替换成b 但是这是复合语句 %a% 并未赋值 所以是空  然后变成%%%% 第二步 偶数 脱一半 变成 %%
第二个 代码 加了一个call 就是 再脱一次   %% 又 变成 %

是这样理解的吗?

TOP

本帖最后由 apang 于 2014-10-18 00:55 编辑

set a=b&echo %%%a%%%
第一个%是对第二个%转义,脱去一个
第3个和第4个之间为引用变量的值%a%,因为没开启变量延迟,为空
第5个对第6个转义,脱去一个
所以最后为两个%
1

评分人数

TOP

返回列表