Câu hỏi Sử dụng dấu gạch chéo ngược để thoát khỏi ký tự trong cmd.exe (ví dụ như lệnh runas)


Tôi thấy rằng dấu mũ là ký tự thoát được ghi lại.

Nhưng, tôi có một ví dụ cho thấy rằng đối với nhân vật trích dẫn kép, ^ không hoạt động và bạn phải sử dụng \

C:\>runas /user:Administrator "cmd /k dir \"%userprofile%\""

Tại sao vậy, và nó được ghi chép ở đâu?


4
2017-08-30 09:40


gốc




Các câu trả lời:


Một trong những ví dụ trong RUNAS /? cho thấy cú pháp đó. Dấu mũ là ký tự thoát cho CMD.EXE nhưng trong các chương trình cá nhân của Windows thì miễn phí để thực hiện các ký tự thoát của riêng chúng và phát triển.


4
2017-08-30 10:00



thú vị .. và btw .. cmd.exe đang làm gì với các dấu trích dẫn không thoát ở cuối? nó giữ chúng, nếu vậy tại sao .. Hay nó loại bỏ chúng .. nếu vậy, tại sao họ cần ở nơi đầu tiên? - barlop
@barlop: Xem Michael's câu trả lời. - Dennis Williamson
bạn có chắc \ "đang được giải thích bởi runas và không phải bởi cmd.exe? biên dịch w.c này pastebin.com/28Q2Wxxr  w.exe So sánh a) w "a a" b) w \ "a a \" c) w ^ "a a ^" Chú ý điều gì xảy ra với b nói riêng. Tôi đoán đó là xử lý vỏ cmd \ như một ký tự thoát. - barlop
trong khi nó đã không được cmd.exe mà giải thích nó, nó không phải là một trong hai chương trình, đó là thời gian chạy mà chia args. Tôi không chắc chắn nếu một trong những sẽ gọi là chương trình được tự do để thực hiện nó. giống như cách trình biên dịch thực hiện nó, hoặc cách trình biên dịch cài đặt nó cho các chương trình. bất kỳ chương trình nào được viết trong tôi giả sử, ms visual c, sẽ phân tích cú pháp argsv "do đó" msdn.microsoft.com/en-us/library/a1y7w461.aspx - barlop


Trong cmd, \ làm không phải bỏ trốn ". Đây là bằng chứng và giải thích nhanh:

  1. Chạy echo "" & echo 1. (& là một char đặc biệt trong cmd, left & right có nghĩa là chạy left sau đó chạy right.) Chúng ta có thể thấy cả hai echo "" và echo 1 được chạy thành công.

  2. Tiếp theo, chạy echo " & 1234. Chúng ta có thể thấy rằng đầu ra là " & 1234. Điều này là do việc mở " đã không được đóng lại, và do đó mọi thứ sau khi nó được hiểu là một chuỗi, bao gồm cả char đặc biệt &.

  3. Chạy echo "\" & 1234.

    • Nếu \ thoát khỏi những điều sau ", mở " sẽ không bị đóng và các ký tự & 1234 sẽ được hiểu là một phần của chuỗi.

    • Nếu \ không thoát được những điều sau ", cái đó tiếp theo " sẽ đóng chuỗi và & 1234 sẽ không phải được hiểu là một phần của chuỗi.

    Trong đầu ra, chúng ta không thấy & 1234 được hiểu là một phần của chuỗi. Điều này chứng minh rằng \ đã không trốn thoát ".

Vì vậy, những gì thoát " trong dấu ngoặc kép cho đối số đi qua? Trong khi ^ sẽ hoạt động bên ngoài dấu ngoặc kép (dễ dàng được chứng minh qua echo ^" & echo 1), nó không thoát khỏi dấu ngoặc kép trong dấu ngoặc kép.

Thật vậy, làm thế nào chúng ta có thể nhận được một cái gì đó đơn giản như echo """  &  echo 1 làm việc?

Các ^ char? ... Không, echo "^"" & echo 1 đầu ra "^"", và không """.

Vậy còn " char chính nó? ... Không, echo """" & echo 1  đầu ra """", và không """.

Sự thật là, không có gì để thoát " trong dấu ngoặc kép cho đối số. Bạn có thể nuôi dưỡng điều này trong một vài năm và không có giải pháp. Đây chỉ là một số hạn chế vốn có của kịch bản lệnh cmd.

Tuy nhiên, tin tốt là bạn sẽ rất có thể không bao giờ đi qua một tình huống mà theo đó bạn cần phải làm như vậy. Chắc chắn, không có cách nào để có được echo """  &  echo 1 để làm việc, nhưng đó không phải là một vấn đề lớn bởi vì nó chỉ đơn giản là một vấn đề mà bạn sẽ không bao giờ gặp phải.

Ví dụ: xem xét runas. Nó hoạt động tốt mà không cần phải thoát " trong dấu ngoặc kép vì runas biết rằng không có cách nào để làm như vậy và thực hiện các điều chỉnh nội bộ để làm việc xung quanh nó. runas đã phát minh ra các quy tắc phân tích cú pháp của riêng nó (runas /flag "anything even including quotes") và không diễn giải các đối số cmd theo cách thông thường. Tài liệu chính thức cho các cú pháp đặc biệt này khá thưa thớt (hoặc không tồn tại). Ngoài ra /? và help, phần lớn là dùng thử và lỗi.


6
2017-08-26 01:33





Các \ dấu hiệu làm cho thông dịch viên giải thích dấu hiệu tiếp theo là tính cách thay vì một định danh.

Bạn cũng thấy nó rất nhiều trong mã:

"Hello \"World\""

đây là giải thích như

Hello "World"

trong ví dụ của bạn, để chuyển các đối số đến cmd, nó cần được đính kèm trong "". Nhưng kể từ khi các đối số cmd chứa "(và điều này sẽ kết thúc bao vây) chúng được nối thêm bởi \. Nếu "" không có ở đó, /k dir \"%userprofile%\" sẽ được hiểu là đối số runas, không phải cmd.

Lý do tại sao chúng được kèm theo% userprofile% là vì đây là một biến môi trường và sẽ được thay thế bằng văn bản có thể chứa khoảng trống, mà (vì lý do tương tự như trên) sẽ làm cho đối số cmd sai.


3
2017-08-30 13:48



Trông tôi như RunAs "cần" trích dẫn khi tham số thứ hai, tham số chương trình, có một khoảng trống. Nếu không, nó nghĩ rằng nó đang được đưa ra nhiều thông số hơn nó. Về lý thuyết, runas có thể đã được viết (tôi có nghĩa là mã hóa) để mang nó đến cùng, như một tham số không có dấu ngoặc kép cần thiết. Ngược lại với điều này. cmd.exe ví dụ: cmd / c dir a b Điều đó lấy -dir a b- làm tham số. - barlop
Ngoài ra, một điểm phức tạp hơn, có vẻ với tôi như runas có thể đã làm mà không có \ "Nhưng không thể bởi vì nó đang lấy" như là bắt đầu và tiếp theo "như là kết thúc.Nếu nó chỉ mất những người outter-nhất là bắt đầu và kết thúc, sau đó nó sẽ không cần những cái ở giữa là \ "vd ngay cả một dòng khó chịu như thế này C: \> runas / user: Administrator "runas / user: Administrator \" cmd / k dir \ "% userprofile% \" \ "" Nếu nó là tất cả "và no \" thì về mặt lý thuyết bạn vẫn có thể xử lý nó. Nhưng không phải vì cách runas đã được viết. - barlop
@barlop: Đừng nghĩ về cmd như là đối số cho runas, bởi vì nó không phải là. Đối số cho runas là cmd /k dir \"%userprofile%\". Tôi không có thời gian, nhưng hãy cho tôi một vài giờ và tôi sẽ có thể giải thích một chương trình C ++ đơn giản cho bạn và cách các chương trình đó diễn giải các đối số. Tôi nghĩ nó sẽ rõ ràng hơn. Vì thế, câu trả lời bị ràng buộc để thay đổi - Default
Thực ra tôi có thể hiểu và không rõ ràng. Tôi biết về phương pháp chính và argsv. Tôi nghe nói rằng họ lấy tất cả các đối số trong phần tử đầu tiên của họ? Có đúng không? Về tôi đề cập đến cmd.exe, có một sự mơ hồ cho dù tôi có nghĩa là cmd.exe trong dòng đó, hoặc cmd.exe outter rằng dòng được viết in. Thời gian duy nhất tôi đã đề cập cmd.exe trong những gì tôi đã viết trong các ý kiến, đã được cmd / c dir ab Và tôi đúng rằng -dir a b- là 1 tham số. Nhưng tôi đã được thông báo (không biết chính xác) rằng tất cả các chương trình cửa sổ nhận được tất cả các arg của họ như là 1 chuỗi, có lẽ là argsv [0], sau đó chia nó - barlop
@ Michael, nếu bạn muốn nó ở Tại sao hình thức .. Tôi có thể hỏi. Tại sao cmd / c dir a b được hiểu như cmd / c "dir a b" Trong khi với runas, tham số chương trình (Xem runas /?) Muốn báo giá. Tôi nghĩ runas có thể dễ dàng được mã hóa để không muốn chúng. Kể từ khi nhìn tôi như lý thuyết nó không cần chúng. - barlop