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

[文本处理] [分享]批处理区分引号内外,转义特殊字符

[复制链接]
发表于 2012-1-30 16:50:37 | 显示全部楼层 |阅读模式
记得初中的时候有节数学课,老师叫同学从有 10 个球的袋子里取 8 个,那位同学却只拿了两个球。
老师很惊讶:“还有六个呢?”
同学说:“那八个都在袋子里。”
早已记不清这堂课究竟是讲什么的了,但唯独对这件事记忆犹新。

在批处理中,我们可以用相同的办法,把字符串中的特殊字符简单转义,并且能区别对待引号对内外的特殊字符。

原理:
  1. ::str 原始值为: "&"&
  2. set "str=!str:&=^&!"
  3. ::str 的值变为: "^&"^&
  4. set "str="^&"^&"
  5. ::str 的值变为: "&"^&
复制代码
for 未开启变量延迟的环境:
  1. :testg"j!l>!k(s)"d&vj|l!fs^d
  2. @echo off&setlocal enabledelayedexpansion
  3. set /p str=<%0
  4. echo    原始字符串:!str!
  5. :: 获取原始字符串

  6. for %%a in (^^ ^& ^| ^( ^) ^< ^>) do set "str=!str:%%a=^%%a!"
  7. echo  转义特殊字符:!str!
  8. :: 为所有特殊字符前缀一个 ^ 转义符。

  9. setlocal disabledelayedexpansion
  10. ::关闭变量延迟

  11. set "str=%str%"
  12. :: 这一句是核心,用于将引号对之内多余的 ^ 消除,原理详见前文

  13. echo      最终效果:%str%
  14. :: 因为引号对之外的特殊字符都被加上了 ^,所以此时能正常输出所有内容

  15. pause
复制代码
for 开启了变量延迟的环境:
  1. :testg"j!l>!k(s)"d&vj|l!fs^d
  2. @echo off&setlocal enabledelayedexpansion
  3. set /p str=<%0
  4. echo    原始字符串:!str!

  5. set "str=!str:^=^^!"
  6. :: 特殊字符 ^ 需翻倍

  7. for %%a in (^^ ^& ^| ^( ^) ^< ^>) do set "str=!str:%%a=^^^%%a!"
  8. echo  转义特殊字符:!str!
  9. :: 因为在开启变量延迟的情况下,一条语句中如果含有 !,一定会产生一次额外的转义(以便判断 ! 符号的用途),所以将所有 ^ 翻三倍(2的0次方 + 2的1次方)

  10. echo  转义特殊字符:!str!

  11. set "str=!空变量!%str:!=^^^^^^^!%"
  12. :: 核心语句,将 ! 前缀七个 ^ (2的0次方 + 2的1次方 + 2的2次方),并将引号对之内多余的 ^ 消除
  13. :: 之所以要加个 !空变量!,是防止中 str 不存在 ! 字符时无法触发额外的转义行为。

  14. echo    转义感叹号:!str!
  15. echo      最终效果:%str%
  16. :: 到此证明转义成功~

  17. pause
复制代码

评分

参与人数 2技术 +2 收起 理由
amwfjhh + 1 大大的美味。
qzwqzw + 1 技术上的美味

查看全部评分

发表于 2014-12-3 22:49:42 | 显示全部楼层
这篇可以放到批处理教程里面去了。
 楼主| 发表于 2014-12-3 23:34:36 | 显示全部楼层
发现一个错误,顺便修改下...
发表于 2014-12-4 12:31:41 | 显示全部楼层
把%与=这两个字符再添进去吧。就更完美了。
发表于 2023-2-28 11:50:01 | 显示全部楼层
回复 3# CrLf


    什么错误。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-19 05:24 , Processed in 0.020228 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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