Trên Windows, tình hình có chút khó khăn hơn. Về cơ bản, tất cả các chương trình Win32 nhận được một chuỗi dòng lệnh dài - vỏ (thường là cmd.exe
) có thể thực hiện một số giải thích trước, loại bỏ các chuyển hướng <
và >
chẳng hạn, nhưng không phải là chia nhỏ tại ranh giới từ cho chương trình. Mỗi chương trình phải tự phân tích cú pháp này (nếu họ muốn - một số chương trình không bận tâm). Trong các chương trình C và C++, các thường trình được cung cấp bởi các thư viện runtime được cung cấp với chuỗi công cụ biên dịch sẽ thường thực hiện bước phân tích cú pháp này trước khi gọi là main()
.
Vấn đề là, nói chung, bạn không biết cách một chương trình cụ thể sẽ phân tích cú pháp dòng lệnh. Nhiều chương trình được biên dịch với một số phiên bản của MSVC++, có quirky parsing rules are described here, nhưng nhiều chương trình khác được biên dịch với các trình biên dịch khác nhau sử dụng các quy ước khác nhau.
Điều này được kết hợp bởi thực tế là cmd.exe
có quy tắc phân tích cú pháp kỳ quặc của riêng nó. Dấu mũ (^
) được coi là ký tự thoát và trích dẫn ký tự sau, và văn bản bên trong dấu ngoặc kép được coi là trích dẫn nếu một danh sách các tiêu chí khéo léo được đáp ứng (xem cmd /?
để biết chi tiết đầy đủ). Nếu lệnh của bạn có chứa bất kỳ ký tự lạ nào, nó rất dễ dàng cho ý tưởng của một trong những phần văn bản được trích dẫn và không được đồng bộ với chương trình đích của bạn, và tất cả các địa ngục đều bị mất.
Vì vậy, cách tiếp cận an toàn nhất cho thoát lập luận trên Windows là:
- luận thoát theo cách mong đợi của dòng lệnh phân tích logic của chương trình mà bạn đang gọi điện thoại. (Hy vọng bạn biết logic đó là gì, nếu không, hãy thử một vài ví dụ và đoán.)
- Tham gia các đối số đã thoát với dấu cách.
- Tiền tố mỗi ký tự không phải chữ và số của chuỗi kết quả bằng
^
.
- Nối bất kỳ chuyển hướng hoặc thủ đoạn vỏ nào khác (ví dụ: tham gia lệnh bằng
&&
).
- Chạy lệnh bằng
system()
hoặc backticks.
Nguồn
2009-03-08 07:11:22
Ý anh là gì, thoát args vỏ? Bạn có nghĩa là đặt \ 's trước bất kỳ ký tự như ">" hoặc "" hoặc bạn có muốn bao gồm thoát $' s để mọi người không thể tiêm biến Perl của bạn? Hay cái gì? Đưa ra một ví dụ về ý của bạn. –
Cách thêm dấu ngoặc nhọn bên trong Hệ thống cuộc gọi .... hệ thống ("$ jboss_client/subsystem = ghi/kích thước-luân phiên-tệp-xử lý = MẪU: thêm \\ (định dạng = \ {yyyy \} \\)"); Tôi luôn luôn nhận ra như dưới đây .... formatter = yyyy instaed của farmatter = {yyyy}. Bạn có thể cho tôi một IDEA để giải quyết vấn đề này không? –