Szukam parsera argumentów wiersza poleceń dla .NET [zamknięte]


79

Szukam parsera argumentów wiersza poleceń, takiego jak „Parser wiersza poleceń” z http://www.sellsbrothers.com/tools/Genghis/ .

Funkcje, których szukam:

  • Automatyczne generowanie użycia
  • Powinien być w stanie sprawdzić wymagane i opcjonalne parametry
  • Parametry powinny obsługiwać IEnumerable z obsługą separatora
  • Powinien obsługiwać parametry flag
  • Przydałaby się obsługa łączenia parametrów, takich jak „/ fx” == „/ f / x”
  • Byłoby miło nie wymuszać spacji po parametrze takim jak „/ftest.txt” == „/ f test.txt”

PS: „Parser wiersza poleceń” jest całkiem niezły, bardzo podoba mi się jego projekt, ale nie ma dokumentacji, żadnych nowych aktualizacji i nie mogłem wymyślić pewnych rzeczy, takich jak sprawdzenie wymaganych parametrów.


Wydaje się, że najbardziej elastycznym parserem wiersza poleceń .NET jest: CommandLineParser
gsscodera

Odpowiedzi:


52

Moją ulubioną biblioteką parsowania wiersza poleceń innej firmy jest Parser wiersza poleceń i zakładam, że jest to ten, o którym mówisz. Najnowsze wydanie było niecałe 2 miesiące temu i regularnie pojawiają się zmiany. Jeśli chcesz bardziej dojrzałej oferty, możesz sprawdzić bibliotekę konsoli w projekcie mono (przepraszam, nie mogę w tej chwili znaleźć bezpośredniego łącza do przestrzeni nazw, ale jest to część frameworka mono)


1
Wygląda świetnie, spróbuję.
dr. zły

Próbuję to zaimplementować, czy obsługuje argumenty „flag”? takie jak „-enable”, które nie wymaga wartości tylko prawda / fałsz. Nie mogłem tego znaleźć.
dr. zło

Jeśli dobrze pamiętam, nie jest to po wyjęciu z pudełka, ale modyfikowanie parsera w celu wyszukania niekwalifikowanych przełączników dla wartości boolowskich nie powinno być zbyt pracochłonne, zamiast oczekiwać podania wartości prawda / fałsz.
Raoul

Nawiasem mówiąc, parser mono nazywa się Mono.GetOptions. To zdecydowanie wspiera to, czego szukasz. Możesz pobrać tylko tę część źródła frameworka mono, skompilować ją i odwołać się do niej w swoim projekcie jako alternatywę.
Raoul

Sam korzystałem z tej biblioteki i zgadzam się, że jest to doskonała biblioteka.
Noldorin

20

Spójrz na ndesk.options.

To się nazywa Mono.Options teraz.


3
Użyliśmy ndesk.options z dużym powodzeniem. To pojedyncza klasa, którą możesz po prostu wkompilować w swój kod: ndesk.org/Options
Sean Carpenter

Obecnie ich witryna zawiera ostrzeżenie o niestabilności NDesk.Options. Tylko ostrzeżenie ... może użyj starszej wersji.
Kilhoffer

Mam również dobre doświadczenia z NDesk.Options. Jest wzorowany na Getopt :: Long Perla (co jest doskonałe).
jwd


4

Niestety nie ma wbudowanego wsparcia dla obsługi tego w standardowy sposób. Czy spojrzałeś na PowerShell? Założę się, że w tej powłoce jest klasa, która robi dokładnie to, czego chcesz lub coś podobnego.


Tak, w większości przypadków prawdopodobnie najlepszym rozwiązaniem jest PowerShell. Pisanie cmdletu jest dość łatwe, ale otwiera tak wiele możliwości przy niewielkiej lub zerowej pracy.
John Saunders,

Nie jestem do końca pewien, co masz na myśli, patrząc na PowerShell. To nie jest open source, czy masz na myśli to, że mogę znaleźć cmdlet i przekonwertować go na składnię .NET.
dr. zły

3
Myślę, że ma na myśli „napisz kod jako polecenie cmdlet PowerShell zamiast samodzielnego pliku wykonywalnego”.
Joel Mueller

Obecnie moim domyślnym planem działania jest pisanie programów zorientowanych na wiersz poleceń w postaci poleceń cmdlet PowerShell. W ten sposób nie muszę się martwić o sposób przetwarzania wiersza poleceń.
Peter Stephens

Myślę, że parsowanie argumentów Powerhell jest okropne.
Tim Abell

2

Edytować: jak wskazuje fatcat1111, ta funkcja nie została dostarczona z ostateczną wersją .net 4.0.

C # 4.0 ma całkiem niezły. Prawdopodobnie nie jest to jeszcze zbyt pomocne, ale warto rozważyć spojrzenie na coś, co ułatwi przeskok do wbudowanej wersji, gdy się pojawi. Bart De Smet mówił o tym na swoim blogu B #


2
System.Shell.CommandLine został odcięty od wersji 4 Framework.
Justin R.


1

Weź pod uwagę, że kiedy zaczniesz używać tego parsera, będziesz musiał sam go obsługiwać lub polegać na kimś innym, aby utrzymywał go za Ciebie. Być może lepiej będzie napisać własne, zaczynając od najbardziej krytycznych, natychmiastowych wymagań. Zauważyłem, że wytworzenie dość skomplikowanego parsowania wiersza poleceń dla większości aplikacji konsolowych, nad którymi pracowałem, nie wymaga zbyt wiele pracy.

Zauważyłem również, że kiedy parsowanie stanie się zbyt skomplikowane, może nadszedł czas, aby przestać używać wiersza poleceń.


1
Ponieważ jest to dobrze znany problem i prawie konieczny dla każdego narzędzia wiersza poleceń, założyłem, że powinno być kilka dojrzałych rozwiązań oraz utrzymywanie i pisanie własnego dźwięku, spędzając trochę czasu. Ale hej, skoro nie ma tu wystarczającej odpowiedzi, może masz rację.
dr. zły

1
@Downvoter: -2 rep nie przeszkadza mi. Jeśli chcesz coś zmienić, podaj powód głosowania przeciw.
John Saunders

1

Założę się, że to nie jest to, czego szukasz, ale:

Ktoś tutaj miał ten problem, a jego pierwsza myśl brzmiała: „hej, ocaml ma całkiem niezły!” I szybko przeniósł go do F #.


+1 github.com/nessos/UnionArgParser to całkiem dobry przykład
Ruben Bartelink

1

Używam parsera z książki kucharskiej C # 3.0.

Wszystkie przykłady z tej książki można pobrać tutaj: http://examples.oreilly.com/9780596516109/

Wyszukaj „Argumenty”, a znajdziesz je. Musisz wprowadzić kilka drobnych zmian w kodzie, aby przenieść go z całości do własnej klasy, ale to nie jest duży problem.

Obsługuje wszystkie twoje punkty z wyjątkiem dwóch ostatnich (łączenie parametrów i brakująca spacja).


1

Biblioteka BizArk zawiera parsera wiersza polecenia.

Zasadniczo wystarczy utworzyć klasę, która dziedziczy po CmdLineObject, dodać właściwości, które chcesz wypełnić z wiersza polecenia, dodać CmdLineArgAttribute do właściwości, a następnie wywołać Initialize w swoim programie. Obsługuje również argumenty URL ClickOnce!

Funkcje (ze strony) ...

  • Automatyczna inicjalizacja: właściwości klasy są ustawiane automatycznie na podstawie argumentów wiersza polecenia.
  • Właściwości domyślne: wyślij wartość bez określania nazwy właściwości.
  • Konwersja wartości: używa potężnej klasy ConvertEx zawartej również w BizArk do konwersji wartości na odpowiedni typ.
  • Flagi logiczne. Flagi można określić, po prostu używając argumentu (ex, / b dla prawdy i / b- dla fałszu) lub dodając wartość prawda / fałsz, tak / nie itd.
  • Tablice argumentów. Po prostu dodaj wiele wartości po nazwie wiersza polecenia, aby ustawić właściwość zdefiniowaną jako tablica. Ex, / x 1 2 3 zapełni x tablicą {1, 2, 3} (zakładając, że x jest zdefiniowane jako tablica liczb całkowitych).
  • Aliasy wiersza polecenia: właściwość może obsługiwać wiele aliasów wiersza polecenia. Na przykład Help używa aliasu?.
  • Częściowe rozpoznawanie nazwy. Nie musisz przeliterować pełnej nazwy ani aliasu, wystarczy, że parser rozróżni właściwość / alias od innych.
  • Obsługuje ClickOnce: może inicjować właściwości, nawet jeśli są one określone jako ciąg zapytania w adresie URL dla wdrożonych aplikacji ClickOnce. Metoda inicjowania wiersza polecenia wykryje, czy jest uruchomiona jako ClickOnce, czy nie, więc kod nie musi się zmieniać podczas korzystania z niej.
  • Automatycznie tworzy /? pomoc: Obejmuje to ładne formatowanie, które bierze pod uwagę szerokość konsoli.
  • Załaduj / zapisz argumenty wiersza polecenia do pliku: jest to szczególnie przydatne, jeśli masz wiele dużych, złożonych zestawów argumentów wiersza polecenia, które chcesz uruchamiać wielokrotnie.

0

Jestem fanem portu C # do OptParse, wbudowanej biblioteki w Pythonie. Jest raczej prosty w użyciu w porównaniu z większością innych sugestii tutaj i zawiera wiele przydatnych funkcji oprócz tylko automatycznego analizowania.


0

Możesz polubić mój jeden Rug.Cmd

Łatwy w użyciu i rozszerzalny parser argumentów wiersza poleceń. Uchwyty: Bool, Plus / Minus, String, String List, CSV, Enumeration.

Wbudowany „/?” tryb pomocy.

Wbudowany '/ ??' i tryby generatora dokumentów „/? D”.

static void Main(string[] args) 
{            
    // create the argument parser
    ArgumentParser parser = new ArgumentParser("ArgumentExample", "Example of argument parsing");

    // create the argument for a string
    StringArgument StringArg = new StringArgument("String", "Example string argument", "This argument demonstrates string arguments");

    // add the argument to the parser 
    parser.Add("/", "String", StringArg);

    // parse arguemnts
    parser.Parse(args);

    // did the parser detect a /? argument 
    if (parser.HelpMode == false) 
    {
        // was the string argument defined 
        if (StringArg.Defined == true)
        {
            // write its value
            RC.WriteLine("String argument was defined");
            RC.WriteLine(StringArg.Value);
        }
    }
}

Edycja: To jest mój projekt i jako taka, ta odpowiedź nie powinna być postrzegana jako poparcie strony trzeciej. To powiedziawszy, używam go do każdego programu opartego na wierszu poleceń, który piszę, jest to oprogramowanie typu open source i mam nadzieję, że inni mogą z niego skorzystać.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.