
[分享]批處理區(qū)分引號(hào)內(nèi)外轉(zhuǎn)義特殊字符記得初中的時(shí)候有節(jié)數(shù)學(xué)課,老師叫同學(xué)從有 10 個(gè)球的袋子里取 8 個(gè),那位同學(xué)卻只拿了兩個(gè)球。老師很驚訝:“還有六個(gè)呢?”同學(xué)說:“那八個(gè)都在袋子里。”早已記不清這堂課究竟是講什么的了,但唯獨(dú)對(duì)這件事記憶猶新。在批處理中,我們可以用相同的辦法,把字符串中的特殊字符簡(jiǎn)單轉(zhuǎn)義,并且能區(qū)別對(duì)待引號(hào)對(duì)內(nèi)外的特殊字符。原理:
- ::str 原始值為: &&
- set str=!str:&=^&!
- ::str 的值變?yōu)椋?^&^&
- set str=^&^&
- ::str 的值變?yōu)椋?&^&
nclick="copycode($('code0'));">復(fù)制代碼
for 未開啟變量延遲的環(huán)境:
- :testgj!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轉(zhuǎn)義特殊字符:!str!
- :: 為所有特殊字符前綴一個(gè) ^ 轉(zhuǎn)義符。
- setlocal disabledelayedexpansion
- ::關(guān)閉變量延遲
- set str=%str%
- :: 這一句是核心,用于將引號(hào)對(duì)之內(nèi)多余的 ^ 消除,原理詳見前文
- echo最終效果:%str%
- :: 因?yàn)橐?hào)對(duì)之外的特殊字符都被加上了 ^,所以此時(shí)能正常輸出所有內(nèi)容
- pause
nclick="copycode($('code1'));">復(fù)制代碼
for 開啟了變量延遲的環(huán)境:
- :testgj!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轉(zhuǎn)義特殊字符:!str!
- :: 因?yàn)樵陂_啟變量延遲的情況下,一條語句中如果含有 !,一定會(huì)產(chǎn)生一次額外的轉(zhuǎn)義(以便判斷 ! 符號(hào)的用途),所以將所有 ^ 翻三倍(2的0次方 + 2的1次方)
- echo轉(zhuǎn)義特殊字符:!str!
- set str=!空變量!%str:!=^^^^^^^!%
- :: 核心語句,將 ! 前綴七個(gè) ^ (2的0次方 + 2的1次方 + 2的2次方),并將引號(hào)對(duì)之內(nèi)多余的 ^ 消除
- :: 之所以要加個(gè) !空變量!,是防止中 str 不存在 ! 字符時(shí)無法觸發(fā)額外的轉(zhuǎn)義行為。
- echo轉(zhuǎn)義感嘆號(hào):!str!
- echo最終效果:%str%
- :: 到此證明轉(zhuǎn)義成功~
- pause
nclick="copycode($('code2'));">復(fù)制代碼