2012-06-25 18 views
11

Tôi luôn ghét hàng loạt và tôi vẫn làm, ngay cả đối với những thứ đơn giản nhất tôi thích C hoặc PHP/Perl. Nhưng lần này tôi không thể đi mà không có nó, **** thở dài ****.Hàng loạt: Thoát bằng dấu mũ

Tôi muốn chuyển hướng lệnh echo đến lệnh khác. Ví dụ:

echo example | more 

nhưng tôi cũng muốn để có thể sử dụng ký tự đặc biệt ở phần tiếng vang của ống:

echo & | more 

Trong đó tất nhiên đã không làm việc. Vì vậy, tôi đã thử:

echo ^& | more 

Chúng cũng không hoạt động. Sau đó, bằng thử và lỗi tôi tìm thấy:

echo ^^^& | more 

và cách đó hiệu quả. Nhưng như lập trình viên quan tâm, tôi tự hỏi tại sao. Tại sao ^& không hoạt động và ^^^& đã làm?

+1

Tôi thấy điều này, có thể điều này hữu ích cho bạn? http://stackoverflow.com/questions/3813370/how-to-avoid-cmd-exe-interpreting-shell-special-characters- giống như – JohnP

+1

+1, mặc dù bạn làm dịu vẻ đẹp của loạt toàn năng, LOL . Tôi hiểu lô là cực kỳ kỳ quặc, không phù hợp và không được ghi chép.Nhưng sau đó tôi đoán thách thức là tại sao tôi có rất nhiều niềm vui với nó :-) – dbenham

+0

@ dbenham, Có bất kỳ nỗ lực nào trong việc ghi lại cú pháp lô từ Windows không? – Pacerier

Trả lời

10

Lý do phải làm với cách Windows thực hiện đường ống - Mỗi bên của đường ống được thực hiện trong vỏ CMD riêng của nó. lệnh của bạn echo ^& | more thực sự cố gắng để thực hiện

C:\Windows\system32\cmd.exe /S /D /c" echo & " 

ở bên trái và

C:\Windows\system32\cmd.exe /S /D /c" more " 

ở bên phải. Bạn có thể thấy lý do tại sao phía bên tay trái không thành công - cố gắng lặp lại một số chưa được thoát &. Việc thoát được tiêu thụ bởi giai đoạn phân tích ban đầu trước khi thực tế bên trái được thực hiện.

Cũng dễ dàng thấy lý do giải pháp của bạn hoạt động. Phía bên trái của echo ^^^& | more trở thành

C:\Windows\system32\cmd.exe /S /D /c" echo ^& " 

Có nhiều biến chứng phức tạp khi làm việc với ống Windows. Tham khảo Why does delayed expansion fail when inside a piped block of code? để biết thêm thông tin. Câu trả lời đã chọn có thông tin tốt nhất, nhưng tôi khuyên bạn nên đọc câu hỏi và tất cả các câu trả lời để có được ngữ cảnh của câu trả lời đã chọn.

+2

1, quá nhanh đối với tôi và không có gì còn lại tôi có thể thêm – jeb

+0

Cảm ơn bạn rất nhiều vì câu trả lời hữu ích của bạn! – Jori

3

Các ^ đầu tiên được thoát khỏi nhân vật ^ tự (thứ hai ^) và thứ ba ^ được thoát khỏi &.

Khi bạn chạy lệnh như ECHO ^& | MORE, ^& được thay thế bằng vỏ & trước khi đầu ra được chuyển đến MORE.

Vì vậy, khi bạn chạy ECHO ^^^& | MORE, vỏ thay thế ^^ với ^^& với & và sau đó dẫn đầu ra đến MORE.

+3

Đoạn đầu tiên của bạn là tốt cho [lưỡi-twister] (https://en.wikipedia.org/wiki/Peter_Piper#Lyrics) ... – Pacerier