找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 21286|回复: 2

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

[复制链接]
发表于 2012-12-19 21:29:14 | 显示全部楼层 |阅读模式
  1. @echo off
  2. set a=^%^%s^%^%
  3. ::这里我知道a被赋值为s,不知道是为什么?
  4. echo %a%
  5. pause
复制代码
晕,搞了好久终于明白了,不敢独享,给大家分享下,请看二楼的解释。
 楼主| 发表于 2012-12-19 21:47:56 | 显示全部楼层
本帖最后由 悬崖之树 于 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 。看来这个方法行不通啊。
 楼主| 发表于 2012-12-19 22:36:58 | 显示全部楼层

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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 00:39 , Processed in 0.015706 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表