Ищу синтаксический анализатор аргументов командной строки для .NET [закрыто]

79

Я ищу синтаксический анализатор аргументов командной строки, например "Анализатор командной строки" из http://www.sellsbrothers.com/tools/Genghis/ .

Особенности, которые я ищу:

  • Автоматическое создание использования
  • Должен иметь возможность проверить обязательные и необязательные параметры
  • Параметры должны поддерживать IEnumerable с поддержкой разделителя
  • Должен поддерживать параметры флага
  • Было бы неплохо поддерживать такие параметры комбинирования, как "/ fx" == "/ f / x"
  • Было бы неплохо не использовать пробел после параметра, такого как "/ftest.txt" == "/ f test.txt"

PS: «Парсер командной строки» довольно хорош, мне очень нравится его дизайн, но нет документации, нет новых обновлений, и я не мог понять, что делать, например, как проверить необходимые параметры.

доктор злой
источник
Самый гибкий синтаксический анализатор командной строки .NET выглядит так: CommandLineParser gsscoder
AlexMelw

Ответы:

52

Моя любимая сторонняя библиотека синтаксического анализа командной строки: анализатор командной строки, и я предполагаю, что это та самая вы говорите. Самый последний выпуск был выпущен менее 2 месяцев назад, и есть регулярные коммиты. Если вы хотите более зрелое предложение, вы можете проверить консольную библиотеку в монопроекте (извините, я не могу найти прямую ссылку на пространство имен на данный момент, но это часть монофреймворка)

Рауль
источник
1
Выглядит отлично, я попробую.
доктор. зло
Я пытаюсь реализовать это, поддерживает ли он аргументы «флага»? например, "-enable", который не требует значения только true / false. Я не мог его найти.
доктор. зло
Если я правильно помню, это не из коробки, но не должно быть слишком много работы, чтобы изменить синтаксический анализатор для поиска неквалифицированных переключателей для логических значений, а не ожидать, что будет указано true / false.
Рауль,
Кстати, моно-парсер называется Mono.GetOptions. Это определенно поддерживает то, что вы ищете. Вы можете загрузить только эту часть исходного кода моно-фреймворка, собрать ее и ссылаться на нее в своем проекте в качестве предупреждения.
Рауль,
Я сам использовал эту библиотеку и согласен, что это отличная библиотека.
Noldorin
20

Взгляните на ndesk.options.

Теперь он называется Mono.Options .

Джон
источник
3
Мы успешно использовали ndesk.options. Это единственный класс, который вы можете просто скомпилировать в свой код: ndesk.org/Options
Шон Карпентер,
В настоящее время на их сайте есть предупреждение о нестабильности NDesk.Options. Просто предупреждение ... возможно, используйте более старую версию.
Килхоффер
У меня также был хороший опыт работы с NDesk.Options. Он основан на Perl Getopt :: Long (что превосходно).
jwd
5

Популярный и довольно полный синтаксический анализатор командной строки C - это GNU getopt . Он был портирован (или клонирован) для C # /. Net несколько раз. Некоторые из них включают:

Сделайте ваш выбор! Есть несколько других, и Google может рассказать вам о них,

Стюарт
источник
4

К сожалению, нет встроенной поддержки, позволяющей справиться с этим стандартным способом. Вы изучали PowerShell? Бьюсь об заклад, в этой оболочке есть класс, который делает именно то, что вы хотите, или что-то подобное.

Джон Лейдегрен
источник
Да, в большинстве случаев лучше всего подходит PowerShell. Написать командлет довольно просто, но он открывает так много возможностей при минимальной работе или вообще без нее.
Джон Сондерс,
Я не совсем понимаю, что вы имеете в виду, говоря о PowerShell. Это не открытый исходный код, или вы имеете в виду, что я могу найти командлет и преобразовать его в синтаксис .NET.
доктор. зло
3
Я думаю, он имеет в виду «напишите свой код как командлет PowerShell, а не как отдельный исполняемый файл».
Джоэл Мюллер,
В наши дни мой план действий по умолчанию - писать программы, ориентированные на командную строку, в виде командлетов PowerShell. Таким образом, мне не нужно беспокоиться о том, как анализируется командная строка.
Питер Стивенс
Я считаю, что парсинг аргументов powerhell ужасен.
Тим Абелл,
2

Редактировать: как указывает fatcat1111, эта функция не поставлялась с окончательной версией .net 4.0.

В C # 4.0 есть неплохой вариант. Возможно, пока не очень полезно, но вы можете подумать о том, чтобы посмотреть на что-то, что упростит переход к встроенному, когда он выйдет. Барт Де Смет рассказал об этом в своем блоге B #

Майк два
источник
2
System.Shell.CommandLine оказался вырезанным из версии 4 Framework.
Джастин Р.
1

Учтите, что как только вы начнете использовать этот синтаксический анализатор, вам придется либо поддерживать его самостоятельно, либо зависеть от кого-то другого, который будет поддерживать его за вас. Возможно, вам лучше написать свое собственное, исходя из ваших самых важных и непосредственных требований. Я обнаружил, что для создания довольно сложного синтаксического анализа командной строки для большинства консольных приложений, над которыми я работал, не требуется слишком много работы.

Я также обнаружил, что, когда синтаксический анализ становится слишком сложным, возможно, пора прекратить использование командной строки.

Джон Сондерс
источник
1
Поскольку это хорошо известная проблема и почти обязательная для любого инструмента командной строки, я предполагал, что должны быть некоторые зрелые решения, а поддержание и написание моего собственного звука немного потратили мое время. Но послушайте, раз здесь недостаточно ответа, возможно, вы правы.
доктор. зло
1
@Downvoter: -2 представителя меня не беспокоят. Если вы хотите изменить ситуацию к лучшему, укажите причину отрицательного голоса.
Джон Сондерс,
1

Держу пари, это не совсем то, что вы ищете, но:

У кого-то здесь была эта проблема, и его первой мыслью было «Эй, у ocaml есть неплохой!», И он быстро перенес ее на F #.

Кен
источник
+1 github.com/nessos/UnionArgParser - довольно хороший пример
Рубен Бартелинк
1

Я использую парсер из поваренной книги C # 3.0.

Все примеры из этой книги можно скачать здесь: http://examples.oreilly.com/9780596516109/

Поищите «Аргументы», и вы их найдете. Вы должны внести небольшие изменения в код, чтобы перенести это из всего этого в свой собственный класс, но это не большая проблема.

Он поддерживает все ваши точки, кроме двух последних (параметр, объединяющий и отсутствующий пробел).

Оливер
источник
1

Библиотека BizArk содержит синтаксический анализатор командной строки.

По сути, вы просто создаете класс, наследуемый от CmdLineObject, добавляете свойства, которые вы хотите заполнить из командной строки, добавляете CmdLineArgAttribute к свойствам, а затем вызываете Initialize в своей программе. Он также поддерживает аргументы URL ClickOnce!

Особенности (с сайта) ...

  • Автоматическая инициализация: свойства класса автоматически устанавливаются на основе аргументов командной строки.
  • Свойства по умолчанию: отправьте значение без указания имени свойства.
  • Преобразование значений: использует мощный класс ConvertEx, также включенный в BizArk, для преобразования значений в правильный тип.
  • Логические флаги. Флаги можно указать, просто используя аргумент (например, / b для истины и / b- для ложного) или путем добавления значения истина / ложь, да / нет и т. Д.
  • Массивы аргументов. Просто добавьте несколько значений после имени командной строки, чтобы задать свойство, определенное как массив. Например, / x 1 2 3 заполнит x массивом {1, 2, 3} (при условии, что x определен как массив целых чисел).
  • Псевдонимы командной строки: свойство может поддерживать для него несколько псевдонимов командной строки. Например, в справке используется псевдоним?.
  • Частичное распознавание имени. Вам не нужно писать полное имя или псевдоним, просто достаточно, чтобы синтаксический анализатор отличил свойство / псевдоним от других.
  • Поддерживает ClickOnce: может инициализировать свойства, даже если они указаны как строка запроса в URL-адресе для приложений, развернутых ClickOnce. Метод инициализации командной строки определит, работает он как ClickOnce или нет, поэтому ваш код не нужно изменять при его использовании.
  • Автоматически создает /? help: это включает красивое форматирование, учитывающее ширину консоли.
  • Загрузка / сохранение аргументов командной строки в файл: это особенно полезно, если у вас есть несколько больших сложных наборов аргументов командной строки, которые вы хотите запускать несколько раз.
Брайан
источник
0

Я поклонник переноса C # на OptParse, встроенную библиотеку на Python. Он довольно прост в использовании по сравнению с большинством других предложений здесь и содержит ряд полезных функций в дополнение к простому автоматическому синтаксическому анализу.

Дэниел Голдберг
источник
0

Вам может понравиться мой единственный Rug.Cmd

Простой в использовании и расширяемый анализатор аргументов командной строки. Дескрипторы: Bool, Plus / Minus, String, String List, CSV, Enumeration.

Встроенный в '/?' режим помощи.

Встроенный '/ ??' и режимы генератора документов '/? 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);
        }
    }
}

Изменить: это мой проект, и поэтому этот ответ не следует рассматривать как одобрение третьей стороны. Тем не менее, я использую его для каждой программы на основе командной строки, которую я пишу, это открытый исходный код, и я надеюсь, что другие могут извлечь из него пользу.

Фил Тью
источник