Предложения по реализации интерфейса командной строки

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

 dmckee20 сент. 2008 г., 18:57
Это может помочь узнать, на какую среду вы ориентируетесь.

Ответы на вопрос(17)

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

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

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

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

араметры] ....

Например,

YourApp.exe -file %YourProject.prj% -Secure true


https://github.com/gene-l-thomas/coptions
Это на nugetInstall-Package coptions

using System;
using System.Collections.Generic;
using coptions;

[ApplicationInfo(Help = "This program does something useful.")]
public class Options
{
    [Flag('s', "silent", Help = "Produce no output.")]
    public bool Silent;

    [Option('n', "name", "NAME", Help = "Name of user.")]
    public string Name
    {
        get { return _name;  }
        set { if (String.IsNullOrWhiteSpace(value))
                throw new InvalidOptionValueException("Name must not be blank");
              _name = value;
        }
    }
    private string _name;

    [Option("size", Help = "Size to output.")]
    public int Size = 3;

    [Option('i', "ignore", "FILENAME", Help = "Files to ignore.")]
    public List<string> Ignore;

    [Flag('v', "verbose", Help = "Increase the amount of output.")]
    public int Verbose = 1;

    [Value("OUT", Help = "Output file.")]
    public string OutputFile;

    [Value("INPUT", Help = "Input files.")]
    public List<string> InputFiles;
}

namespace coptions.ReadmeExample
{
    class Program
    {
        static int Main(string[] args)
        {
            try
            {
                Options opt = CliParser.Parse<Options>(args);

                Console.WriteLine(opt.Silent);
                Console.WriteLine(opt.OutputFile);
                return 0;
            }
            catch (CliParserExit)
            {
                // --help
                return 0;

            } catch (Exception e)
            {
                // unknown options etc...
                Console.Error.WriteLine("Fatal Error: " + e.Message);
                return 1;
            }
        }
    }
}

Поддержка автоматической генерации --help, глаголов, например commmand.exe
Наслаждаться.

 22 янв. 2018 г., 20:54
я смотрел наcommand line а такжеclipr прежде чем я посмотрел на кодирование чего-либо, так как оба используют аннотации. Я значительно расширил clipr, чей код был лучшего качества, а API был более аккуратным, но в итоге он использовал разумные имена [Option] и [Value], добавив [Flag], который отличается от пользователя (без значения). Теперь я добавил поддержку для заполнения полей (меньше ввода), параметры стиля / windows и -x11. И анализ файлов .ini. Ссылка будетgithub.com/GeneThomas/coptions .
 15 янв. 2018 г., 19:08
Ваша ссылка не работает. Так что нет сопроводительной документации. Кстати, ваша библиотека кажется клономgsscoder command line parser...

https://commandline.codeplex.com/

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

Latest stable: Install-Package CommandLineParser. Latest release: 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);
  }
}
 15 янв. 2018 г., 19:03
Этот анализатор командной строки имеетnew home.
Решение Вопроса

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

На сайте GNU также перечисленыимена стандартных опций.

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

 01 янв. 2012 г., 04:02
@dbr, optparse устарела сейчас, хотя, в пользуdocs.python.org/library/argparse.html
 26 июл. 2009 г., 11:50
В Python используйте optparse -docs.python.org/library/optparse.html - этоso much лучше использовать, чем getopt
 23 янв. 2014 г., 23:03
термин «комплектация» Возможно, более распространенным является описание практики группировки коротких опций, чем «сложение».
 26 июл. 2009 г., 10:45
Для Windows стандарт де-факто использует/foo (но также и поддержка-fooВ стиле BSD) для переключателей без параметров и/foo:value (опять же, с альтернативой-foo:falue) для тех, у кого есть параметры. Другими словами, синтаксис используется всеми инструментами командной строки Microsoft (Win32 из коробки, средства разработки и т. Д.).

I developed this framework, maybe it helps:

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

Tests:

// 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

что можно сделать, - это не брать на себя что-либо, если можешь. Когда оператор вводит имя вашего приложения для выполнения и не имеет никаких параметров, нажмите на него блоком 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 и т. Д.

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

которые вы используете для своего приложения, будут зависеть от

1) Какой тип приложения это.
2) Какую операционную систему вы используете. Linux? Окна? У них обоих разные соглашения.

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

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

 lillq20 сент. 2008 г., 19:47
Почему важно, пишу ли я для Linux против Windows? Я думаю, что должен быть стандартный формат, универсальный между ними. Если у вас есть более глубокое понимание этого и вы хотите поделиться, дайте мне знать.
 13 окт. 2011 г., 10:56
Это важно, потому что две операционные системы делают вещи по-разному. В примере параметров для приложений командной строки linux использует -, а windows использует / для указания ключей. ls -l в unix, dir / ah для windows. Чтобы выбрать одно отличие.
 22 мар. 2013 г., 15:00
@lillq, возможно, между ними должен быть общий формат, но это не так.

shortcuts.
Т.е. все следующие строки делают одно и то же

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

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

 10 окт. 2008 г., 16:40
Именно так! За исключением того, что я использую эту функцию для другого CLI управления версиями: cleartool (ct) из ClearCase;). Поскольку я также управляю репозиториями Subversion, я делаю большую часть команд svn и svnadmin ...
 10 окт. 2008 г., 16:03
Этот метод особенно полезен с такими инструментами, как Darcs, Git и Subversion, где по сути есть набор связанных, но различных команд.

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

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

Each param has 2 CLI representations (1 character and string, e.g. -a or --add) Default values Strongly typed Automagically produces an help screen with instructions Automagically produces a version and copyright screen
 07 дек. 2009 г., 22:50
Похоже, Mono устарел и ссылается на NDesk.Options:ndesk.org/Options

1) What type of application it is. 2) What operating system you are using.

Это определенно правда. Я не уверен насчет соглашений о быстрой посылке, но в Unix-подобных системах общие соглашения примерно такие:

1) Форматирование

appName parameters

2) Односимвольные параметры (такие как «x») передаются как -x 3) Многосимвольные параметры (такие как «add-keys») передаются как --add-keys.

которая включает анализатор командной строки. Вам просто нужно создать класс, который наследуется от класса CmdLineObject, вызвать Initialize, и он автоматически заполнит свойства. Он может обрабатывать преобразования в различные типы (использует расширенную библиотеку преобразований, также включенную в проект), массивы, псевдонимы командной строки, аргументы с однократным нажатием и т. Д. Он даже автоматически создает справку командной строки (/?).

Если вы заинтересованы, URL-адрес проектаhttp://bizark.codeplex.com, В настоящее время он доступен только в виде исходного кода.

 22 мая 2014 г., 08:38
Что насчетcommandline.codeplex.com ?

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

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

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

 01 окт. 2014 г., 14:00
Install-Package CommandLineParser  просто и легко :)
 29 июн. 2012 г., 12:50
Я посмотрел это. Это кажется слишком простым.

ерфейсов командной строки, например, getopts, то вы автоматически согласитесь.

CLI :: Application рамки могут быть именно то, что вам нужно. Он позволяет легко создавать приложения с пользовательским интерфейсом, подобным SVN / CVS / GIT (& quot; ваша команда -o --long-opt some-action-to-execute Некоторые параметры & quot;).

не допускайте неоднозначных сокращений. Например:

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

Фактически, в этом случае я, вероятно, не приму аббревиатуру для «уничтожить» ...

 24 сент. 2008 г., 21:16
Хороший вопрос, неоднозначность - еще один критерий, который нужно учитывать ... +1 к вам, сэр.

Ваш ответ на вопрос