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

[文本处理] 帮忙解释一下下面的BAT代码为什么会输出 s?

  1. @echo off
  2. set a=^%^%s^%^%
  3. ::这里我知道a被赋值为s,不知道是为什么?
  4. echo %a%
  5. pause
复制代码
晕,搞了好久终于明白了,不敢独享,给大家分享下,请看二楼的解释。
时光荏苒||新陈代谢&&涛声依旧||本性难移

RE: 关于变量嵌套的运行机制的解释

  1. @echo off &setlocal enabledelayedexpansion
  2. set a=%%%%s%%%%
  3. echo !a!
  4. echo %a%
  5. set s=qdj
  6. call call call echo %a%
  7. pause
复制代码
运行后为
%%s%%
%%s%%
qdj
请按任意键继续. . .
下面是解释:
set a=%%%%s%%%%    预处理时,将%%变成%,这样就把a赋值为 %%s%%
echo !a!  此句经过两次预处理就变成 echo %%s%%
echo %a%  预处理时,替换%a%  得到 echo %%s%% 由于这里的%是存在于变量a中的,所以没有被当成是特殊字符。但如果直接是 echo %%ss 之类的,%将被当做特殊字符。

重点是 call call call echo %a%
%a%替换后为 call call call echo %%s%%(注意,这里由于call的存在,已经不分第一次第二次预处理了,同时call也会引发预处理)   
第一个call后 为 call call echo %s%
第二个call后,为 call echo qdj
第三个call后,仍旧是 echo qdj  也就是这个call不起作用!
最后echo输出qdj
时光荏苒||新陈代谢&&涛声依旧||本性难移

TOP

本帖最后由 悬崖之树 于 2012-12-19 21:54 编辑

主要问题在于 set a=^%^%s^%^%
预处理时,先替换%^%,由于^没有定义,所以为空,就变成 set a=^s^
然后 处理特殊符号,变成 set a=s
就是这样子。
而我写 set a=^%^%s^%^%&set s=qdj&call echo %a%
          的初衷是 将a赋值为%%s%%,然后call echo %a%就变成 call echo %%s%%
          call处理后,就变成 echo %s%,然后输出 qdj 。看来这个方法行不通啊。
时光荏苒||新陈代谢&&涛声依旧||本性难移

TOP

返回列表