Một nhận xét bổ sung cho answer của FrVaBe.
Thông thường, ^^!
hoạt động, nhưng trong dấu ngoặc kép bạn chỉ cần ^!
thay thế.
echo I want to go out with a bang^^!
echo He said "Bang^!"
Đây là kết quả của cơ chế thoát của trình phân tích cú pháp theo lô.
Đầu tiên trình phân tích cú pháp một dòng và dấu mũ thoát ký tự tiếp theo, trong trường hợp này nó có hiệu lực cho &|<>()"<linefeed>
, nhưng chỉ bên ngoài dấu ngoặc kép, bên trong dấu ngoặc kép tất cả ký tự là "bình thường" không có hiệu lực.
Với việc mở rộng trễ thêm một bước phân tích tiếp theo, dấu mũ cũng là ký tự thoát cho ký tự tiếp theo, nhưng chỉ ảnh hưởng đến !
và ^
và dấu ngoặc kép bị bỏ qua trong bước phân tích cú pháp này. Bước bổ sung này sẽ chỉ được thực hiện, nếu có ít nhất một !
trong dòng.
setlocal DisableDelayedExpansion
echo DisableDelayedExpansion
echo one caret^^
echo one caret^^ bang! "boom^!"
echo(
setlocal EnableDelayedExpansion
echo EnableDelayedExpansion
echo one caret^^
echo none caret^^ bang^^! "boom^!"
---- OUTPUT ------
DisableDelayedExpansion
one caret^
one caret^ bang! "boom^!"
EnableDelayedExpansion
one caret^
none caret bang! "boom!"
EDIT
Dưới đây là một ví dụ chút thay đổi để minh họa rõ hơn về hoán vị thoát khác nhau mà là bắt buộc, tùy thuộc vào ngữ cảnh. Trường hợp duy nhất yêu cầu thoát không bình thường là ví dụ cuối cùng khi mở rộng bị trễ và có ít nhất một số !
trên dòng.
@echo off
setlocal DisableDelayedExpansion
echo DisableDelayedExpansion
echo caret^^ "caret^"
echo caret^^ bang! "caret^ bang!"
echo(
setlocal EnableDelayedExpansion
echo EnableDelayedExpansion
echo caret^^ "caret^"
echo caret^^^^ bang^^! "caret^^ bang^!"
- OUTPUT -
DisableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"
EnableDelayedExpansion
caret^ "caret^"
caret^ bang! "caret^ bang!"
Tuyệt vời, cảm ơn –
Btw, nếu bạn phải thay dấu chấm than bên trong biến, bạn sẽ làm như thế nào? – crosenblum
@crosenblum Tôi khuyên bạn nên đặt câu hỏi này như một câu hỏi của riêng mình. Hơn nó sẽ là visbile cho tất cả các thành viên SO và rất có thể trả lời. – FrVaBe