
[分享&討論]批處理變量賦值時含有雙引號及特殊符號如何轉義
我試著總結了下。另外1.特殊符號在不同的環境下會有變化;2.其它命令大概也適用。如echo &、if 跟vbs命令需轉義)、for /f in ('echo ^=') 等。請多多指正!nclick="copycode($('code0'));">復制代碼
- @echo off
- echo 假設:雙引號不成對(不包括被轉義的雙引號),則末尾存在隱形雙引號
- echo 已知:雙引號對內的特殊字符(包括^<>&|不包括 %%!)無需轉義
- echo 1.變量名前無雙引號:從左(set 后)到右,雙引號(包括隱形雙引號,不包括被轉義的雙引號)雙雙配對,處于 雙引號對 外 需要轉義,處于 雙引號對 內 不需要轉義。
- rem 存在一個顯形雙引號,與末尾的隱形雙引號配對,引號對內的 < 無需轉義
- set a=<
- cmd /v:on /c echo !a!
- rem 對比:多余的“轉義”字符,變普通字符
- set a=^<
- cmd /v:on /c echo !a!
- rem 存在一個顯形雙引號 但是被轉義了,失去配對資格(沒有雙引號對,所有字符都在雙引號對之外),需要轉義 <
- set a=^^<
- cmd /v:on /c echo !a!
- rem 第一個雙引號被轉義,失去配對資格,第二個雙引號與末尾的隱形雙引號配對,無需轉義 <
- set a=^<
- cmd /v:on /c echo !a!
- rem 前兩個雙引號配對,第三個與末尾的隱形雙引號配對,第一個 < 無需轉義,第二個 < 需要轉義,末尾 | 無需轉義
- set a=<^<|
- cmd /v:on /c echo !a!
- echo=
- echo 2.變量名前有雙引號:仍按上一條規律,變量值去除了最后一個顯形雙引號及其后的內容
- rem 雙引號對內的 | 無需轉義,雙引號對外的 | 需要轉義
- set a=^||1
- cmd /v:on /c echo !a!
- rem 即使變量值去除了最后一個顯形雙引號及其后的內容,最后一個雙引號后的內容仍需要按規律書寫轉義
- set a=^||1^<
- cmd /v:on /c echo !a!
- echo=
- echo 3.^ 處于雙引號對內,則其失去轉義作用(只是普通字符),此時其后跟隨的雙引號仍為可以配對的雙引號
- rem ^ 處于雙引號對內,失去轉義作用
- set a=^<1
- cmd /v:on /c echo !a!
- rem 第3個雙引號被轉義,失去配對資格,第4個雙引號與隱形雙引號配對,第4個雙引號之前的 < 處于雙引號對外,需要轉義
- set a=^1^^<<
- cmd /v:on /c echo !a!
- echo=
- echo 4. ^ 處于末尾情況
- rem ^ 處于雙引號對外,末尾的偶數位數 ^ 被奇數位數 ^ 轉義為普通字符。末尾的 ^ 數量為奇數時,最后一個 ^ 未被轉義,連接了下一行
- set c=1^^^
- 2
- cmd /v:on /c echo c=!c!
- set d=1^^^^
- cmd /v:on /c echo d=!d!
- rem ^ 處于雙引號對內(第一個雙引號與與隱形的雙引號配對),無論多少個 ^ 均被雙引號對轉義,為普通字符
- set e=^^^^^
- cmd /v:on /c echo e=!e!
- rem 一個復雜例子,^ 處于雙引號對外,連接了下一行,但是變量名前存在雙引號,最后一個雙引號及其后的內容被去除,且 ^ 仍有轉義作用,轉義了 &
- set f=1^
- &2
- cmd /v:on /c echo f=!f!
- pause

