Предложения по реализации интерфейса командной строки - PullRequest
34 голосов
/ 20 сентября 2008

Я перерабатываю приложение для командной строки и ищу способ сделать его использование более интуитивно понятным. Существуют ли какие-либо соглашения для формата параметров, передаваемых в приложение командной строки? Или любой другой метод, который люди нашли полезным?

Ответы [ 17 ]

28 голосов
/ 20 сентября 2008

Я вижу много особенностей командной строки Windows, но если ваша программа предназначена для Linux, я считаю, что стандарт командной строки GNU наиболее интуитивен. В основном, он использует двойные дефисы для длинной формы команды (например, --help) и одиночный дефис для короткой версии (например, -h). Вы также можете «сложить» короткие версии вместе (например, tar -zxvf filename) и смешать «n match long» и «short» с содержанием вашего сердца.

На сайте GNU также перечислены

стандартные имена опций .

Библиотека getopt значительно упрощает анализ этих команд. Если C не ваша сумка, Python имеет подобную библиотеку, как и Perl .

13 голосов
/ 20 сентября 2008

Если вы используете C #, попробуйте Mono.GetOptions , это очень мощный и простой в использовании анализатор аргументов командной строки. Он работает в средах Mono и с Microsoft .NET Framework.

РЕДАКТИРОВАТЬ: Вот несколько функций

  • Каждый параметр имеет 2 представления CLI (1 символ и строка, например, -a или --add)
  • Значения по умолчанию
  • Сильно набранный
  • Автоматически создает экран справки с инструкциями
  • Автоматически создает версию и окно с информацией об авторских правах
4 голосов
/ 22 мая 2014

Хорошая и полезная ссылка:

https://commandline.codeplex.com/

Библиотека доступна через NuGet:

  1. Последняя стабильная версия: Install-Package CommandLineParser.
  2. Последний выпуск: Install-Package CommandLineParser -pre.

Разбор одной строки с использованием синглтона по умолчанию: CommandLine.Parser.Default.ParseArguments(...).
Генератор экрана справки в одну строку: HelpText.AutoBuild(...).
Сопоставьте аргументы командной строки с IList<string>, массивами, перечислением или стандартными скалярными типами.
Плагин дружественной архитектуры, как описано здесь.
Определите команды глагола как git commit -a.
Создайте экземпляр парсера, используя лямбда-выражения.

Быстрый старт: https://commandline.codeplex.com/wikipage?title=Quickstart&referringTitle=Documentation

// Define a class to receive parsed values
class Options {
  [Option('r', "read", Required = true,
    HelpText = "Input file to be processed.")]
  public string InputFile { get; set; }

  [Option('v', "verbose", DefaultValue = true,
    HelpText = "Prints all messages to standard output.")]
  public bool Verbose { get; set; }

  [ParserState]
  public IParserState LastParserState { get; set; }

  [HelpOption]
  public string GetUsage() {
    return HelpText.AutoBuild(this,
      (HelpText current) => HelpText.DefaultParsingErrorsHandler(this, current));
  }
}

// Consume them
static void Main(string[] args) {
  var options = new Options();
  if (CommandLine.Parser.Default.ParseArguments(args, options)) {
    // Values are available here
    if (options.Verbose) Console.WriteLine("Filename: {0}", options.InputFile);
  }
}
4 голосов
/ 20 сентября 2008

Что мне нравится в некоторых CLI, так это использование ярлыков .
Т.е. все следующие строки делают одно и то же

myCli.exe describe someThing
myCli.exe descr someThing
myCli.exe desc someThing

Таким образом, пользователю не обязательно каждый раз вводить команду all.

3 голосов
/ 20 сентября 2008

Дополняя ответ @ vonc, не принимайте неоднозначные сокращения. Например:

  myCli.exe describe someThing
  myCli.exe destroy someThing
  myCli.exe des someThing ???

На самом деле, в этом случае, я, вероятно, не приму аббревиатуру для "уничтожить" ...

3 голосов
/ 20 сентября 2008

Соглашения о командной строке варьируются от ОС к ОС, но соглашение, которое, вероятно, получило как наибольшее применение, так и самое публичное изучение, - это соглашение, поддерживаемое пакетом GNU getopt. См. http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html для получения дополнительной информации.

Позволяет смешивать однобуквенные команды, такие как -nr, с более длинными, самодокументируемыми параметрами, такими как --numeric --reverse. Будьте внимательны и используйте опцию --help (-?), И тогда ваши пользователи смогут выяснить все, что им нужно знать.

3 голосов
/ 20 сентября 2008

Вот статья CodeProject, которая может вам помочь ...

C # /. NET Аргументы командной строки Parser

Если вам нравится VB, ознакомьтесь с отдельной статьей (с чуть более подробным содержанием) ...

Анализировать и проверять параметры командной строки с помощью VB.NET

3 голосов
/ 20 сентября 2008

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

c:\>FOO

FOO

USAGE FOO -{Option}{Value}

-A Do A stuff
-B Do B stuff

c:\>

Разграничение параметров я ставлю под заголовком религиозной темы: дефисы (тире), двойные дефисы, косые черты, ничего, позиционные и т. Д.

Вы не указали свою платформу, но для следующего комментария я буду использовать Windows и .net

Вы можете создать консольное приложение в .net и позволить ему взаимодействовать с рабочим столом с помощью форм, просто выбрав консольный проект, а затем добавив библиотеки Windows.Forms, System.Drawing и т. Д.

Мы делаем это все время. Это гарантирует, что никто не свернет в темный переулок.

2 голосов
/ 20 сентября 2008

Я всегда добавляю /? параметр, чтобы получить помощь, и я всегда стараюсь иметь реализацию по умолчанию (т.е. наиболее распространенный сценарий).

В противном случае я склонен использовать «/ x» для переключателей и «/ x: значение» для переключателей, которые требуют передачи значений. Облегчает анализ параметров с помощью регулярных выражений.

1 голос
/ 23 мая 2017

Я разработал этот фреймворк, может быть, он поможет:

SysCommand - это мощная кроссплатформенная инфраструктура для разработки консольных приложений в .NET. Простой, безопасный для типов и с большим влиянием шаблона MVC.

https://github.com/juniorgasparotto/SysCommand

namespace Example.Initialization.Simple
{
    using SysCommand.ConsoleApp;

    public class Program
    {
        public static int Main(string[] args)
        {
            return App.RunApplication();
        }
    }

    // Classes inheriting from `Command` will be automatically found by the system
    // and its public properties and methods will be available for use.
    public class MyCommand : Command
    {
        public void Main(string arg1, int? arg2 = null)
        {
            if (arg1 != null)
                this.App.Console.Write(string.Format("Main arg1='{0}'", arg1));
            if (arg2 != null)
                this.App.Console.Write(string.Format("Main arg2='{0}'", arg2));
        }

        public void MyAction(bool a)
        {
            this.App.Console.Write(string.Format("MyAction a='{0}'", a));
        }
    }
}

Тесты:

// auto-generate help
$ my-app.exe help

// method "Main" typed
$ my-app.exe --arg1 value --arg2 1000

// or without "--arg2"
$ my-app.exe --arg1 value

// actions support
$ my-app.exe my-action -a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...