Dấu ngoặc góc thoát trong dấu nhắc lệnh Windows


93

Tôi cần lặp lại một chuỗi chứa dấu ngoặc nhọn (<và>) tới một tệp trên máy Windows. Về cơ bản những gì tôi muốn làm là như sau:
echo some string < with angle > brackets >>myfile.txt

Điều này không hoạt động vì trình thông dịch lệnh bị nhầm lẫn với các dấu ngoặc nhọn. Tôi có thể trích dẫn toàn bộ chuỗi như thế này:
echo "some string < with angle > brackets" >>myfile.txt

Nhưng sau đó tôi có dấu ngoặc kép trong tệp của mình mà tôi không muốn.

Thoát khỏi dấu ngoặc đơn ala unix cũng không hoạt động:
echo some string \< with angle \> brackets >>myfile.txt

Ý tưởng?


6
Các trích dẫn cũng sẽ được lặp lại.
dalle 30/10/08

Câu trả lời:


171

Ký tự thoát trong Windows là ^, vì một số lý do.

echo some string ^< with angle ^> brackets >>myfile.txt

10
Chà, dấu gạch chéo ngược được sử dụng cho tên đường dẫn và dấu ngoặc kép là để bao bọc tên tệp có khoảng trắng, vì vậy không còn nhiều lựa chọn ký tự.
James Curran

Điều này cũng hoạt động đối với các ký tự khác như dấu và (&), cảm ơn.
tenfour

2
Hoạt động tuyệt vời! echo some string ^< with angle ^> brackets >>conkết quả trong: một số chuỗi <với góc> dấu ngoặc
Ross Bradbury

1
Tất cả bởi vì pc-dos gốc đã sử dụng dấu gạch chéo ngược cho các đường dẫn và khả năng tương thích ngược.
Jahmic

Tôi nghi ngờ tất cả không phải là ngẫu nhiên. Tôi đoán là họ muốn sử dụng một ký tự khó có thể xuất hiện trong văn bản bình thường, để nó không gây ra những ký tự dễ dàng tránh được nhưng không mong muốn.
David A. Gray

23

Đúng, ký tự thoát chính thức là vậy ^, nhưng hãy cẩn thận vì đôi khi bạn cần ba ^ ký tự. Đây chỉ là đôi khi :

C:\WINDOWS> echo ^<html^>
<html>

C:\WINDOWS> echo ^<html^> | sort
The syntax of the command is incorrect.

C:\WINDOWS> echo ^^^<html^^^> | sort
<html>

C:\WINDOWS> echo ^^^<html^^^>
^<html^>

Một mẹo nhỏ của điều vô lý này là sử dụng một lệnh khác ngoài echoviệc thực hiện đầu ra và trích dẫn bằng dấu ngoặc kép:

C:\WINDOWS> set/p _="<html>" <nul
<html>
C:\WINDOWS> set/p _="<html>" <nul | sort
<html>

Lưu ý rằng điều này sẽ không bảo toàn các khoảng trống ở đầu trên văn bản lời nhắc.


1
Xem phần thứ 2 của câu trả lời của tôi để biết giải thích tại sao các đường ống yêu cầu nhiều lối thoát.
dbenham

Ba ^^^cũng cần thiết để thoát lệnh trong bảng điều khiển Azure DOS / Kudu.
lionello

8

Có những phương pháp tránh ^trình tự thoát.

Bạn có thể sử dụng các biến có mở rộng bị trì hoãn. Dưới đây là một trình diễn kịch bản hàng loạt nhỏ

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
echo !line!

Hoặc bạn có thể sử dụng vòng lặp FOR / F. Từ dòng lệnh:

for /f "delims=" %A in ("<html>") do @echo %~A

Hoặc từ một tập lệnh hàng loạt:

@echo off
for /f "delims=" %%A in ("<html>") do echo %%~A

Lý do những phương pháp làm việc là vì cả hai mở rộng chậm và CHO mở rộng biến xảy ra sau khi các nhà khai thác đặc biệt thích <, >, &, |, &&, ||được phân tích cú pháp. Hãy xem Trình thông dịch lệnh Windows (CMD.EXE) phân tích cú pháp tập lệnh như thế nào? để biết thêm thông tin.


sin3.14 chỉ ra rằng các đường ống có thể yêu cầu nhiều lần thoát . Ví dụ:

echo ^^^<html^^^>|findstr .

Lý do các đường ống yêu cầu nhiều lần thoát là vì mỗi bên của đường ống được thực thi trong một quy trình CMD mới, do đó đường được phân tích cú pháp nhiều lần. Hãy xem Tại sao việc mở rộng bị trì hoãn không thành công khi bên trong một khối mã có đường ống?để giải thích về nhiều hậu quả khó xử của việc triển khai đường ống của Window.

Có một phương pháp khác để tránh thoát nhiều lần khi sử dụng đường ống. Bạn có thể khởi tạo rõ ràng quy trình CMD của riêng mình và bảo vệ lối thoát duy nhất bằng dấu ngoặc kép:

cmd /c "echo ^<html^>"|findstr .

Nếu bạn muốn sử dụng kỹ thuật mở rộng trì hoãn để tránh thoát, thì còn có nhiều điều bất ngờ hơn nữa (Bạn có thể không ngạc nhiên nếu bạn là chuyên gia về thiết kế CMD.EXE, nhưng không có tài liệu chính thức của MicroSoft giải thích về điều này)

Hãy nhớ rằng mỗi bên của đường ống được thực thi trong quy trình CMD.EXE của riêng nó, nhưng quy trình này không kế thừa trạng thái mở rộng bị trì hoãn - nó được mặc định là TẮT. Vì vậy, bạn phải khởi tạo rõ ràng quy trình CMD.EXE của riêng mình và sử dụng tùy chọn / V: ON để kích hoạt tính năng mở rộng bị trì hoãn.

@echo off
setlocal disableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo !test!|findstr .

Lưu ý rằng mở rộng bị trì hoãn đang TẮT trong tập lệnh lô chính.

Nhưng tất cả sẽ tan vỡ nếu mở rộng bị trì hoãn được bật trong tập lệnh mẹ. Cách sau không hoạt động:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
REM - the following command fails
cmd /v:on /c echo !test!|findstr .

Vấn đề là nó !test!được mở rộng trong tập lệnh mẹ, vì vậy quy trình CMD mới đang cố gắng phân tích cú pháp không được bảo vệ <>.

Bạn có thể thoát khỏi !, nhưng điều đó có thể trở nên khó khăn, bởi vì nó phụ thuộc vào việc có !được trích dẫn hay không.

Nếu không được trích dẫn, thì bắt buộc phải thoát kép:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c echo ^^!test^^!|findstr .

Nếu được trích dẫn, thì một lối thoát duy nhất được sử dụng:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
cmd /v:on /c "echo ^!test^!"|findstr .

Nhưng có một thủ thuật đáng ngạc nhiên giúp tránh tất cả các lần thoát - bao quanh bên trái của đường ống ngăn không cho tập lệnh mẹ mở rộng !test!quá sớm:

@echo off
setlocal enableDelayedExpansion
set "line=<html>"
(cmd /v:on /c echo !test!)|findstr .

Nhưng tôi cho rằng ngay cả khi đó không phải là bữa trưa miễn phí, bởi vì trình phân tích cú pháp hàng loạt giới thiệu một khoảng trống thừa (có lẽ không mong muốn) ở cuối khi dấu ngoặc đơn được sử dụng.

Aint batch scripting fun ;-)


3

Để sử dụng các ký tự đặc biệt, chẳng hạn như '>' trên Windows với echo, bạn cần đặt một ký tự thoát đặc biệt trước nó.

Ví dụ

echo A->B

sẽ không hoạt động vì '>' phải được thoát bằng '^':

 echo A-^>B

Xem thêm trình tự thoát . nhập mô tả hình ảnh ở đây

Có một tệp hàng loạt ngắn, trong đó in một bộ ký tự đặc biệt cơ bản và trình tự thoát của chúng.


0

Thoát khỏi dấu ngoặc đơn ala unix cũng không hoạt động:

echo một số chuỗi \ <với angle \> ngoặc nhọn >> myfile.txt

Dấu gạch chéo ngược sẽ được coi là bắt đầu của một tên đường dẫn tuyệt đối.


2
Absolute tên đường dẫn tương đối so với ký tự ổ đĩa hiện hành ...;)
men

Dấu gạch chéo ngược không được coi là phần bắt đầu của tên đường dẫn tuyệt đối bên trong văn bản đối với lệnh echo - nó chỉ là văn bản thuần túy được ghép vào bất cứ nơi nào bạn gửi nó. - echo \ ví dụ hoạt động như mong đợi. - Nhưng có, "\" sẽ là một sự lựa chọn không tốt cho một ký tự thoát dòng lệnh vì mọi lệnh / chương trình cần đường dẫn hoặc tên tệp bạn phải nhập `\` thay thế.
BrainSlugs83

1
câu trả lời này không đưa ra giải pháp cho câu hỏi, được thừa nhận là mơ hồ
G-.

-2

Bạn cũng có thể sử dụng dấu ngoặc kép để thoát các ký tự đặc biệt ...

echo some string "<" with angle ">" brackets >>myfile.txt

4
Điều đó không hoạt động. echo some string "<" with angle ">" brackets >>conkết quả là: một số chuỗi "<" với dấu ngoặc nhọn ">" nhưng OP muốn một số chuỗi <có dấu ngoặc nhọn>
Ross Bradbury
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.