2010-10-28 33 views
22

Tôi cố gắng để sử dụng các lớp OptionSet theo cách sau:NDesk.Options: làm thế nào để đăng ký các thông số cần thiết một cách chính xác?

string resultsFileName = null; 
    bool isHelp = false; 

    var p = new OptionSet() { 
    { "r=|resultsFile=", "The file with the results", v => { resultsFileName = v; } } 
    { "h|help", "Show this help", v => { isHelp = (v != null); } }, 
    }; 

    try 
    { 
    p.Parse(args); 
    } 
    catch (OptionException e) 
    { 
    Console.WriteLine("Invalid arguments: " + e.Message); 
    ShowHelp(p); 
    return; 
    } 

Như vậy, resultsFile lựa chọn dự kiến ​​sẽ được cần (theo tài liệu: http://www.ndesk.org/doc/ndesk-options/NDesk.Options/OptionValueType.html). Tuy nhiên, khi tôi chạy chương trình như (tức là không có đối số dòng lệnh) ngoại lệ không được ném. Xin vui lòng giúp đỡ.

Cập nhật: Dường như trong trình gỡ lỗi như khi không có tùy chọn dòng lệnh nào được cung cấp, phương pháp private void AssertValid (int index) sẽ không bao giờ đạt đến throw new OptionException.

Trả lời

23

Đây là bản sao của How to enforce required command-line options with NDesk.Options?answer is the same: NDesk.Options không hỗ trợ điều đó.

Trích dẫn bản thân mình:

Theo OptionValueType.Required tài liệu, các = trong một đặc điểm kỹ thuật lựa chọn không áp dụng cho các OptionSet như một toàn thể, nhưng chỉ để các giá trị cho rằng tùy chọn cụ thể.

Tầm quan trọng của điều này thực sự là chỉ có liên quan trong hai kịch bản, vì vậy đầu tiên chúng ta hãy xem xét các phân tích cú pháp OptionSet:

string a = null; 
string b = null; 
var options = new OptionSet { 
    { "a=", v => a = v }, 
    { "b=", v => b = v }, 
}; 

Kịch bản 1 nơi điều quan trọng là OptionSet.Parse() làm việc trong một đơn-pass, chỉ có cách chuyển tiếp và không không xem xét các giá trị tùy chọn để xác định xem chúng có phải là giá trị "phải" hay không. Do đó, hãy xem xét:

options.Parse(new[]{"-a", "-b"}); 

Kết quả của việc này sẽ là a có giá trị "-b", và bnull. Vì trình xử lý cho -ayêu cầu một giá trị, nó luôn là nhận giá trị sau (trừ khi giá trị được "mã hóa" vào tùy chọn gốc, ví dụ: -a=value).

Các vị trí thứ hai nơi này là rất quan trọng là khi một lựa chọn đáng giá yêu cầu là lựa chọn cuối cùng, và không có một giá trị hiện tại cho nó:

options.Parse(new[]{"-a"}); 

này sẽ ném một OptionException, như xử lý cho -ayêu cầu giá trị và không có giá trị nào.

Do đó, nếu bạn có một lựa chọn mà bản thân là cần thiết (như trái ngược với một lựa chọn mà đòi hỏi phải có một giá trị), bạn cần phải tự kiểm tra này:

string dir = null; 
new OptionSet { 
    { "o=", v => dir = v }, 
}.Parse (args); 

if (dir == null) 
    throw new InvalidOperationException ("Missing required option -o=DIR"); 
+3

cảm ơn cho câu trả lời nhanh chóng! (một chút băn khoăn rằng chức năng này không được hỗ trợ, mặc dù, vì nó sẽ góp phần vào sự mạnh mẽ của các xác nhận đối số dòng lệnh). – BreakPhreak

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