Giả sử bạn muốn chuỗi ^&AntiBatchfileString
theo nghĩa đen, đây là set
cú pháp tốt nhất, vì hầu hết các ký tự đặc biệt (^
&
(
)
<
>
|
và cũng chuẩn delimiters ,
;
=
SPACETAB) mất ý nghĩa đặc biệt của họ ngay khi được đặt ở giữa số ""
và chính bản thân số ""
không trở thành một phần của giá trị biến:
set "pass=^&AntiBatchfileString"
Điều này chỉ hoạt động miễn là tiện ích mở rộng lệnh được bật, mặc định là Windows (loại cmd /?
và xem tùy chọn /E
).
Khi mở rộng (đọc) biến số như "%pass%"
(có kèm theo ""
), các ký tự đặc biệt vẫn được xử lý theo nghĩa đen.
Tuy nhiên, ngay khi bạn mở rộng nó như %pass%
(không có ""
), chúng sẽ lấy lại ý nghĩa đặc biệt của chúng. Vì vậy, bạn có các tùy chọn sau:
- Sử dụng
set "pass=^^^&AntiBatchfileString"
, nơi ^^
thoát khỏi sự theo nghĩa đen ^
và ^&
các literal &
khi đọc như %pass%
.
- Bật mở rộng trễ (xem
set /?
về cách hoạt động và setlocal /?
hoặc cmd /?
về cách bật), nơi giá trị biến được mở rộng (đọc) tại thời điểm phân tích các ký tự đặc biệt đã được hoàn thành.
Tôi thích cách tiếp cận thứ hai, vì không cần thoát đặc biệt và cũng có thể xử lý "
xuất hiện trong giá trị chuỗi (ngay cả khi không có đối xứng).
Nhân tiện, "
cũng có thể được thoát bởi ^"
, miễn là điều này không xuất hiện trong phạm vi chưa được thoát ""
.
Tuy nhiên, %
dấu hiệu không thể trốn thoát như ^%
trong một tập tin thực thi, nhưng bạn cần phải tăng gấp đôi họ như %%
để có được một một nghĩa đen từng, độc lập hay không chuỗi là ở giữa ""
.
Lưu ý rằng trên bảng điều khiển, %%
không hoạt động mặc dù ^%
thực hiện.
Cuối cùng, tính năng mở rộng bị trì hoãn khi được bật, do đó bạn cần đặc biệt chú ý đến những trường hợp đó, bằng cách thoát chúng như ^!
hoặc cũng bằng cách thông minh. nó thực sự cần thiết và để vô hiệu hóa nó nếu không, khi một chuỗi ký tự được cung cấp, ví dụ như trong dòng lệnh set
, khi mở rộng biến chuẩn như %pass%
và khi đọc biến số for
như %%I
(tập tin theo lô) hoặc %I
(bảng điều khiển)), ví dụ). Tất nhiên đây cũng không phải là giải pháp tối thượng, bởi vì bạn cần setlocal
và endlocal
để bật/tắt mở rộng chậm, nhằm thay đổi môi trường, vì vậy bất kỳ thay đổi biến nào do lệnh setlocal
gần đây nhất bị mất ngay sau khi endlocal
được thực hiện (có một số thủ thuật để vượt qua một giá trị thay đổi qua ngưỡng cản endlocal
).
Bản sao có thể có của [Thoát ký tự hàng loạt] (https://stackoverflow.com/questions/6828751/batch-character-escaping) –