Шукаємо парсер аргументів командного рядка для .NET [закрито]


79

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

Особливості, які я шукаю:

  • Автоматичне генерування використання
  • Повинен перевірити необхідні та необов’язкові параметри
  • Параметри повинні підтримувати IEnumerable із підтримкою роздільника
  • Має підтримувати параметри прапора
  • Було б непогано підтримати поєднання таких параметрів, як "/ fx" == "/ f / x"
  • Було б непогано застосовувати силу до пробілу після такого параметра, як "/ftest.txt" == "/ f test.txt"

PS: "Синтаксичний аналізатор командного рядка" цілком непоганий, мені дуже подобається його дизайн, але немає документації, немає нових оновлень, і я не міг зрозуміти, як робити певні речі, наприклад, як перевірити наявність необхідних параметрів.


Здається, найбільш гнучким синтаксичним аналізатором командного рядка .NET є: CommandLineParser
gsscoder

Відповіді:


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's 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 закінчився вирізанням з v4 Framework.
Джастін Р.


1

Подумайте, що як тільки ви почнете використовувати цей парсер, вам доведеться або самостійно його підтримувати, або ж залежати від когось іншого, щоб підтримувати його для вас. Можливо, вам краще написати свої власні, починаючи з найважливіших, безпосередніх вимог. Я виявив, що для того, щоб виконати досить складний аналіз командного рядка для більшості консольних програм, над якими я працював, не потрібно занадто багато роботи.

Я також виявив, що коли синтаксичний аналіз стає занадто складним, можливо, час припинити використання командного рядка.


1
Оскільки це добре відома проблема і майже необхідна для постійного використання інструменту командного рядка, я припускав, що мають бути кілька зрілих рішень, а підтримка та запис власного звуку трохи витрачають час. Але привіт, оскільки тут недостатньо відповіді, можливо, ти маєш рацію.
доктор злий

1
@Downvoter: -2 повторення мене не турбують. Якщо ви хочете щось змінити, будь ласка, вкажіть причину проти.
Джон Сондерс,

1

Б'юся об заклад, це не зовсім те, що ви шукаєте, але:

У когось тут була така проблема, і його перша думка була: "привіт, у ocaml досить гарна!", І швидко переніс її на F #.


+1 github.com/nessos/UnionArgParser є досить гарним прикладом
Рубен Бартелінк

1

Я використовую парсер із кулінарної книги С # 3.0.

Усі приклади з цієї книги можна завантажити тут: http://examples.oreilly.com/9780596516109/

Шукайте "Аргументи", і ви знайдете його. Вам потрібно внести невеликі зміни коду, щоб вивести його з цілого у свій власний клас, але це не становить великої проблеми.

Він підтримує всі ваші точки, крім останніх двох (поєднання параметрів та відсутність місця).


1

Бібліотека BizArk містить парсер командного рядка.

В основному ви просто створюєте клас, який успадковує від CmdLineObject, додаєте властивості, які ви хочете заповнити з командного рядка, додаєте CmdLineArgAttribute до властивостей, а потім викликаєте Initialize у вашій програмі. Він також підтримує аргументи URL-адреси ClickOnce!

Особливості (з сайту) ...

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

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

Редагувати: Це мій проект, і як така, ця відповідь не повинна розглядатися як схвалення від третьої сторони. Тим не менш, я використовую його для кожної написаної програми на основі командного рядка, вона є відкритим вихідним кодом, і я сподіваюся, що інші можуть скористатися нею.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.