2010-07-20 34 views

Trả lời

66

Đó là những gì tôi tìm thấy (^^)

@echo off 
setlocal ENABLEDELAYEDEXPANSION 
echo I want to go out with a bang^^! 
+4

Tuyệt vời, cảm ơn –

+2

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

+2

@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

54

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à 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!" 
+0

@dbenham cảm ơn các ví dụ bổ sung – jeb

5

Cảm ơn. "!" Để thêm vào điểm có giá trị này, nếu kịch bản của một người chứa một biến giá trị có chứa một, sau đó các phương pháp sau đây sẽ làm cho giá trị mà như-là:

 
@echo off 
SETLOCAL EnableDelayedExpansion 
set /P omg=Enter a value that contains an exclamation-point: 
echo Traditional: %omg% 
echo Alternative: !omg! 
pause 
4

Hãy tìm thấy bên dưới ví dụ này, để làm sao chúng ta có thể sử dụng biến dấu chấm than trong các trạng thái DISABLEDELAYEDEXPANSIONENABLEDELAYEDEXPANSION.

@echo off 
setlocal DISABLEDELAYEDEXPANSION 
set DB_password=encrypt!Pws 
echo %DB_password% 
SETLOCAL ENABLEDELAYEDEXPANSION 
echo !DB_password! 
+0

Câu trả lời hay nhất! Điều này giải quyết việc sử dụng trong các kịch bản mà DELAYEDEXPANSION là cần thiết. – JasonXA

+0

Thực ra - không phải là câu trả lời hay, tôi sẽ đề xuất xóa. Lý do: SETLOCAL là bộ nhớ tốn kém, và bạn muốn sử dụng nó càng ít càng tốt. – Lockszmith

+0

Điều đó thật đáng kinh ngạc. Không nơi nào trong yêu cầu là bộ nhớ một mối quan tâm và tôi sử dụng nó rất nhiều mà không có tác dụng xấu. Trừ khi bạn thực sự có thể đóng góp, giữ cho bạn vô nghĩa với chính mình. – JasonXA

Các vấn đề liên quan