2017-04-12 23 views
5

Tôi đang cố chuyển nhiều đường dẫn dưới dạng đối số cho ứng dụng bảng điều khiển nhưng đang gặp lỗi "Ký tự không hợp lệ trong đường dẫn". Có vẻ như có điều gì đó đang nhầm lẫn hai ký tự cuối cùng của đối số "C:\test\" cho một dấu trích dẫn kép thoát.Tại sao C# xuất hiện để loại bỏ một phần đối số dòng lệnh?

Ví dụ, nếu tôi tạo ra một ứng dụng mới có sản phẩm nào console trong C# như sau:

static void Main(string[] args) 
{ 
    Console.WriteLine(args[0]); 
    Console.ReadLine(); 
} 

và, dưới Project Properties -> Debug tôi thêm một đối số dòng lệnh như vậy:

Project properties showing CLI Argument: "C:\test\"

sau đó đầu ra của tôi trông như thế này:

Command prompt showing output: C:\test"

Nếu giá trị đang được đánh giá/bỏ thoát, tại sao \t không trở thành tab?

Nếu giá trị KHÔNG được đánh giá/không thoát, tại sao \" trở thành báo giá kép?

(Lưu ý: Tôi biết tôi có thể làm việc này bằng cách, ví dụ, cắt tỉa đuôi backslashes vv Tôi đang yêu cầu giúp đỡ tìm hiểu lý do tại sao những lập luận dường như phần đánh giá)

+0

http://stackoverflow.com/questions/17168961/how-do-i-escape-in-verbatim-string và http://stackoverflow.com/questions/15932279/escaping-command-line-arguments- đường dẫn in-c-sharp-for-urls-và-local-and-network- –

Trả lời

5

Phải thừa nhận rằng điều này liên quan đến Microsoft C Command Line Arguments, nhưng tôi đã thử nghiệm rằng những quy tắc này cũng được theo sau cho C#. Đối số dòng lệnh được phân tách thành mảng string args[] trước khi được chuyển vào ứng dụng.

Parsing C Command-Line Arguments

  • luận cứ được giới hạn bởi không gian màu trắng, đó là cả một không gian hoặc một tab.

  • Một chuỗi được bao quanh bởi dấu ngoặc kép được hiểu là một đối số duy nhất, bất kể khoảng trắng nằm trong đó. Một chuỗi trích dẫn có thể được nhúng trong một đối số. Lưu ý rằng dấu mũ (^) không được nhận dạng là ký tự thoát hoặc dấu tách.

  • Dấu ngoặc kép phía trước dấu gạch chéo ngược, \ ", được hiểu là dấu ngoặc kép kép (").

  • Dấu gạch chéo ngược được diễn giải theo nghĩa đen, trừ khi chúng ngay trước dấu ngoặc kép.

  • Nếu một số chẵn dấu gạch chéo ngược theo sau là dấu ngoặc kép, thì một dấu gạch chéo ngược() được đặt trong mảng argv cho mỗi cặp dấu chéo ngược (\) và dấu ngoặc kép (") được hiểu là Nếu một số lẻ dấu gạch chéo ngược được theo sau bởi dấu ngoặc kép, thì một dấu gạch chéo ngược() được đặt trong mảng argv cho mỗi cặp dấu chéo ngược (\) và dấu ngoặc kép được diễn giải là một chuỗi thoát bằng dấu gạch chéo ngược còn lại, gây ra dấu nháy kép (") được đặt trong argv.

Các quy tắc này dường như đồng ý với kết quả bạn đang xem.

Tôi chạy các ứng dụng giao diện điều khiển sau để kiểm tra các quy tắc:

static void Main(string[] args) 
{ 
    foreach (string s in args) 
    { 
     Console.WriteLine(s); 
    } 
    Console.ReadLine(); 
} 

Với các đối số dòng lệnh sau:

arg1 "arg2 arg3" arg4\" "arg5\"" arg6\\\" 

Output:

arg1 
arg2 arg3 
arg4" 
arg5" 
arg6\" 

Lý do tranh luận đầu vào của bạn xuất hiện chưa được thoát là lần đầu tiên ngoặc kép được hiểu là dấu tách chuỗi bắt đầu và dấu ngoặc kép thứ hai được thoát bằng dấu gạch chéo ngược trước và được diễn giải dưới dạng dấu nháy kép bằng chữ - không phải là dấu phân cách kết thúc.

+0

Cảm ơn vì điều đó. Tôi tự hỏi điều gì điên rồ đã dẫn đến tập hợp "quy tắc" đó và cách mọi người dự kiến ​​sẽ xử lý các tên thư mục đi qua xung quanh ... –

+1

@AlexMcMillan Cảm ơn lòng tốt đã có người viết chúng xuống. – khargoosh

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