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

要转义! , 就是^! ,但这只是延迟拓展阶段内的 , 在延迟拓展阶段之外 , ^也是一个特殊字符 , 也需要转义
换句话说 , 你需要的是一个延迟拓展阶段的^!来供延迟阶段解析时转义成! , 还得对^!中^再次进行转义

^^!经过命令解析变成^!
^!经过延迟拓展解析变成!

这东西需要了解cmd的解析规则 , 可以参考
https://stackoverflow.com/questi ... pts/4095133#4095133
1

评分人数

    • GNGW: 这个帖子是一个缺口,目前为止深入技术的帖 ...技术 + 1

TOP

呃 , ^就是bat中的转义符 , 但是转义没说只会转义1次 , 也就是说可能会转义2次 , 3次 ,甚至4次 ....
就像xxx表示1个反斜杠(\)时 , 需要8个反斜杠(\\\\\\\\) , 这期间转义了3次反斜杠

这也意味着需要了解规则了解流程 , 掌握流程中那些是需要转义的 , 转义了的多少次

开启延迟变量后 , 两个!包围的会变成变量 , !有了特殊作用 , 这很明显!是需要转义的 (因为要表示!本身) ,
单纯的输出! , 流程总共expansion了2次 ,因此会有2次转义

TOP

回复 9# GNGW


    啊???6楼连接里的Phase 2)跟Phase 5)不就是了???  echo语句的话 正好2个
就算没说明 , 自己根据步骤模拟一下代码的解析和执行流程不就行了

TOP

回复 11# GNGW

嗯???自己动手啦
参考6楼链接
根据代码 自己思考流程或画或写(如下面的) 然后观察流程和实际执行结果
就算实际执行结果不一致 也总有自己的理解或见解吧
不知道对不对 是不是这样 就多弄些例子验证并总结就是

代码
  1. setlocal enabledelayedexpansion
  2. @echo ^^!
  3. echo ^^
  4. pause
复制代码
流程
  1. 读取第1行,得到setlocal enabledelayedexpansion
  2. 读取到的不包含% , 不需要预处理(或处理前后一致)
  3. 解析读取到的内容 , 解析后得到命令setlocal和命令参数enabledelayedexpansion
  4. 显示解析到的内容setlocal enabledelayedexpansion(因为命令开头不是@ , 之前也没有关闭回显)
  5. 执行命令setlocal , 执行后开启了变量延迟
  6. 读取第2行,得到@echo ^^!
  7. 读取到的不包含% , 不需要预处理(或处理前后一致)
  8. 解析读取到的内容 , 解析后得到以@开头的命令echo和命令参数^!
  9. 将解析后的内容扔给变量延迟处理(因为开启了变量延迟) , 处理后得到以@开头的命令echo和命令参数!
  10. 执行echo命令 , 显示输出一个!
  11. 继续读取第3行,得到echo ^^
  12. 不需要预处理
  13. 解析读取到的内容 , 解析后得到命令echo和命令参数^
  14. 显示解析到的内容echo ^
  15. 将解析后的内容扔给变量延迟处理 , 处理后得到命令echo和命令参数^(处理前后一致 , 因为内容不包含!)
  16. 执行echo命令 , 显示输出一个^
  17. 继续读取第4行,得到pause
  18. 不需要预处理
  19. 解析读取到的内容 , 得到命令pause
  20. 显示解析到的内容pause
  21. 将解析后的内容扔给变量延迟处理 , 处理后得到命令pause
  22. 执行命令pause , 请按任意键继续. . .
  23. 按任意键后 , 结束
复制代码

TOP

返回列表