记得初中的时候有节数学课,老师叫同学从有 10 个球的袋子里取 8 个,那位同学却只拿了两个球。
老师很惊讶:“还有六个呢?”
同学说:“那八个都在袋子里。”
早已记不清这堂课究竟是讲什么的了,但唯独对这件事记忆犹新。
在批处理中,我们可以用相同的办法,把字符串中的特殊字符简单转义,并且能区别对待引号对内外的特殊字符。
原理:- ::str 原始值为: "&"&
- set "str=!str:&=^&!"
- ::str 的值变为: "^&"^&
- set "str="^&"^&"
- ::str 的值变为: "&"^&
复制代码 for 未开启变量延迟的环境:- :testg"j!l>!k(s)"d&vj|l!fs^d
- @echo off&setlocal enabledelayedexpansion
- set /p str=<%0
- echo 原始字符串:!str!
- :: 获取原始字符串
-
- for %%a in (^^ ^& ^| ^( ^) ^< ^>) do set "str=!str:%%a=^%%a!"
- echo 转义特殊字符:!str!
- :: 为所有特殊字符前缀一个 ^ 转义符。
-
- setlocal disabledelayedexpansion
- ::关闭变量延迟
-
- set "str=%str%"
- :: 这一句是核心,用于将引号对之内多余的 ^ 消除,原理详见前文
-
- echo 最终效果:%str%
- :: 因为引号对之外的特殊字符都被加上了 ^,所以此时能正常输出所有内容
-
- pause
复制代码 for 开启了变量延迟的环境:- :testg"j!l>!k(s)"d&vj|l!fs^d
- @echo off&setlocal enabledelayedexpansion
- set /p str=<%0
- echo 原始字符串:!str!
-
- set "str=!str:^=^^!"
- :: 特殊字符 ^ 需翻倍
-
- for %%a in (^^ ^& ^| ^( ^) ^< ^>) do set "str=!str:%%a=^^^%%a!"
- echo 转义特殊字符:!str!
- :: 因为在开启变量延迟的情况下,一条语句中如果含有 !,一定会产生一次额外的转义(以便判断 ! 符号的用途),所以将所有 ^ 翻三倍(2的0次方 + 2的1次方)
-
- echo 转义特殊字符:!str!
-
- set "str=!空变量!%str:!=^^^^^^^!%"
- :: 核心语句,将 ! 前缀七个 ^ (2的0次方 + 2的1次方 + 2的2次方),并将引号对之内多余的 ^ 消除
- :: 之所以要加个 !空变量!,是防止中 str 不存在 ! 字符时无法触发额外的转义行为。
-
- echo 转义感叹号:!str!
- echo 最终效果:%str%
- :: 到此证明转义成功~
-
- pause
复制代码
|