Frage

Ich habe eine ziemlich einfache -Konsolenanwendung bekommt. Ich möchte in einigen Befehlszeilenargumente zu übergeben ... nichts hart es.

Nun wird der Kicker ist, ich habe in der Regel eine Liste der Elemente i wollen in passieren, für ein Argument. In diesem Fall wird eine Liste von Dateien. Ich bin mir nicht sicher, ob der beste Weg, dies zu tun.

eg. myapp.exe files=aaa.txt,bbb.txt,ccc.txt 

aber was Dateinamen mit Leerzeichen? Sollte ich Komma es delimate?

, um die Dinge interessant, ich habe andere args bekommt, die .. einzelne Werte annehmen, so dass ich bin mir nicht sicher, ob ich all arg Daten in doppelten Anführungszeichen setzen sollte ..

eg. myapp.exe files=aaa.txt,bbb.txt formatting=true foo=hello

oder

eg myapp.exe files="aaa.txt","bbb.txt" formatting="true" foo="hello"
War es hilfreich?

Lösung

Wahrscheinlich ein bisschen spät für das Programm auf dem Sie arbeiten, aber hier ist, wie Sie es tun könnte mit Mono.Options

static void Main(string[] args)
{
    //let's try this mono.options thing shall we?
    string xapfile = null;
    var files = new List<string>();
    var p = new Mono.Options.OptionSet()
    {
        { "xap=", v => xapfile =v },
        { "file:", v => files.Add(v)}
    };
    List<string> extra = p.Parse(args);


    Console.WriteLine(@"
    xap = '{0}', 
    file(s)= {1}", 
         xapfile, 
         string.Join(",", files.ToArray())
    );
    Console.WriteLine(@"
    left overs: {0}", 
        string.Join(Environment.NewLine, extra.ToArray())
    );
    // rest of your Main here

Syntax aufrufen würde

myapp.exe --file="file 1" --file="file 2" --file="file 3"

Sie könnten verzichten sogar die ganze variable Dateien und nur die übrig gebliebenen wie die Dateien behandeln, und es wie myapp.exe "file 1" "file 2" "file 3" aufrufen und die Dateien aus dem zusätzlichen Liste zupfen.

Mono.Options ist ziemlich mächtig. Sie haben nicht einmal verwenden -, scheint es Sie /file= oder -file= verwenden können,

Leider Windows nicht für Sie tun Globbing (es sei denn Sie die Optionen zu einem Powershell-Cmdlets vorbei sind), so haben Sie es selbst zu tun. Es ist ziemlich einfach aber, hier ein bisschen Code ich habe in der Vergangenheit verwendet *.foo oder "c:\temp\*.bar|c:\temp\*.txt" zu erweitern

Auch wenn Sie die Dateinamen in Talkies wickeln, würde ich wahrscheinlich die Liste nicht Komma trennen, als Komma in einem Dateinamen gültig ist. Sie wissen, dass man geht, Ihnen einen Tag beißen :-) Rohr eine gute Wahl macht, aber nur, wenn Sie den gesamten Ausdruck in Talkies wickeln, sonst Fenster denken, dass Sie Rohrleitungen tun. Ah, die Freuden der Kommandozeilenverarbeitung: -)

Andere Tipps

Jedes Argument, wenn es keine Leerzeichen enthält, muss in Anführungszeichen gesetzt werden. Sonst würde ich Anführungszeichen weglassen davon.

Da die Shell wahrscheinlich Wild Card Globbing ist es am besten zu ermöglichen die Eingabedateien eine Ebene durch Leerzeichen getrennte Liste sein und das zu übernehmen, wenn ein Dateiname Leerzeichen enthält, die es entweder entgangen wurden, wird bereits mit Anführungszeichen oder über \ Zeichen umgeben. Mit dem Flugzeug meine ich keine -F oder / f Stil Schalter enthalten.

Eine etwas weniger verbreitete Technik, aber noch von allen Bibliotheken unterstützten Befehlszeile Parsen tun, ist es, mehrere Einträge der Form -f foo.txt -f bar.txt zu ermöglichen. Dies gilt nicht gut mit Kommandozeile spielen Globbing (im Gegensatz zu der obigen Lösung).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top