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


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

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

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

P. S : "парсер командной строки" довольно хорош, мне очень нравится его дизайн, но нет документации, нет новых обновлений, и я не мог понять, чтобы сделать определенные вещи, такие как проверка необходимых параметров.

12 79

12 ответов:

мой личный любимый 3rd party commandline parsing библиотека Парсер Командной Строки и я предполагаю, что это тот, о котором вы говорите. Самый последний релиз был менее 2 месяцев назад, и есть регулярные коммиты. Если вы хотите более зрелое предложение, вы можете проверить библиотеку консоли в проекте mono (извините, я не могу найти прямую ссылку на пространство имен на данный момент, но это часть структуры mono)

взгляните на ndesk.опции.

Это называется моно.Варианты сейчас.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

характеристики (с сайта)...

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

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

вам может понравиться мой один половик.Cmd

простой в использовании и расширяемый парсер аргументов командной строки. Дескрипторы: Bool, плюс / минус, строка, список строк, CSV, перечисление.

построен в '/?' режим справки.

построен в '/??- и? .. 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);
        }
    }
}

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