2010-10-28 4 views
22

Ich versuche, die OptionSet Klasse in der folgenden Art und Weise zu nutzen:NDesk.Options: Wie werden die erforderlichen Parameter korrekt registriert?

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; 
    } 

So resultsFile Option erforderlich sein soll (nach Dokumentation: http://www.ndesk.org/doc/ndesk-options/NDesk.Options/OptionValueType.html). Wenn ich das Programm jedoch unverändert ausführe (d. H. Ohne Befehlszeilenargumente), wird die Ausnahme nicht ausgelöst. Bitte helfen.

Update: Es sieht in Debugger wie wenn keine Befehlszeilenoptionen zur Verfügung gestellt werden, wird die private void AssertValid (int index) Methode nie throw new OptionException erreicht werden.

Antwort

23

Dies ist ein Duplikat von How to enforce required command-line options with NDesk.Options?, und das answer is the same: NDesk.Options unterstützt das nicht.

mich Zitiert:

sich nach den OptionValueType.Required docs, die = innerhalb einer Option-Spezifikation nicht als Ganzes auf die OptionSet gilt, sondern nur auf den Wert für die jeweilige Option.

Die Bedeutung dieser ist wirklich nur in zwei Szenarien relevant, also lassen Sie uns zunächst die OptionSet Parser betrachten:

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

Szenario 1, wo es wichtig ist, dass OptionSet.Parse() in einem Single-Pass funktioniert, nur Vorwärts-Art und Weise, und tut nicht Option Werte betrachten, um zu bestimmen, ob sie Werte sein sollten. So betrachtet:

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

Das Ergebnis davon wird sein, dass a den Wert "-b" und bnull ist. Da der Handler für -aeinen Wert erfordert, erhält er immer erhält den folgenden Wert (es sei denn, der Wert ist in die ursprüngliche Option "codiert", beispielsweise -a=value).

Der zweite Ort, wo dies wichtig ist, wenn ein Wert erfordernden Option die letzte Option ist, und es ist kein Wert vorhanden für sie:

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

Dies wird eine OptionException, als Handler werfen für -aerfordert einen Wert, und kein Wert ist vorhanden. Folglich

, wenn Sie eine Option, dass selbst erforderlich ist (im Gegensatz zu einer Option im Gegensatz, der einen Wert erfordert), müssen Sie manuell für diese überprüfen:

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

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

Dank für die schnelle Antwort! (ein wenig bedauerlich, dass diese Funktionalität nicht unterstützt wird, da dies zur Robustheit der Validierung der Befehlszeilenargumente beitragen würde). – BreakPhreak