Предложения по реализации интерфейса командной строки
Я занимаюсь редизайном приложения для командной строки и ищу способ сделать его использование более интуитивным. Существуют ли какие-либо соглашения для формата параметров, передаваемых в приложение командной строки? Или любой другой метод, который люди нашли полезным?
17 ответов
Я вижу много особенностей командной строки Windows, но если ваша программа предназначена для Linux, я считаю стандарт командной строки GNU наиболее интуитивным. В основном, он использует двойные дефисы для длинной формы команды (например, --help
) и один дефис для короткой версии (например, -h
). Вы также можете "сложить" короткие версии вместе (например, tar -zxvf
filename
) и микс и подходи долго и коротко к своему сердцу.
На сайте GNU также перечислены стандартные имена опций.
Библиотека getopt значительно упрощает анализ этих команд. Если C не ваша сумка, Python имеет подобную библиотеку, как и Perl.
Если вы используете C#, попробуйте Mono.GetOptions, это очень мощный и простой в использовании анализатор аргументов командной строки. Он работает в средах Mono и с Microsoft .NET Framework.
РЕДАКТИРОВАТЬ: Вот несколько функций
- Каждый параметр имеет 2 представления CLI (1 символ и строка, например, -a или --add)
- Значения по умолчанию
- Сильно набрано
- Автоматически создает экран справки с инструкциями
- Автоматически производит версию и экран авторских прав
Одна вещь, которая мне нравится в некоторых CLI - это использование ярлыков.
Т.е. все следующие строки делают одно и то же
myCli.exe describe someThing
myCli.exe descr someThing
myCli.exe desc someThing
Таким образом, пользователю может не потребоваться вводить команду all каждый раз.
Хорошая и полезная ссылка:
https://commandline.codeplex.com/
Библиотека доступна через NuGet:
- Последняя стабильная:
Install-Package CommandLineParser
, - Последний релиз:
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);
}
}
Лучшее, что можно сделать, это ничего не принимать, если можешь. Когда оператор вводит имя вашего приложения для выполнения и не имеет никаких параметров, нажмите на него блоком 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 и т. Д.
Мы делаем это все время. Это гарантирует, что никто не свернет в темный переулок.
Дополняя ответ @vonc, не принимайте неоднозначных сокращений. Например:
myCli.exe describe someThing
myCli.exe destroy someThing
myCli.exe des someThing ???
На самом деле, в этом случае, я бы, наверное, не принял сокращение от "уничтожить"...
Соглашения о командной строке варьируются от ОС к ОС, но соглашение, которое, вероятно, получило как наибольшее применение, так и самое пристальное внимание, - это соглашение, поддерживаемое пакетом GNU getopt. См. http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html для получения дополнительной информации.
Он позволяет смешивать однобуквенные команды, такие как -nr, с более длинными, самодокументируемыми параметрами, такими как --numeric --reverse. Будьте внимательны и реализуйте опцию --help (-?), И тогда ваши пользователи смогут выяснить все, что им нужно знать.
Вот статья CodeProject, которая может помочь вам...
Анализатор аргументов командной строки C#/.NET
Если VB - ваш вкус, вот отдельная статья (с чуть более подробным руководством), чтобы проверить...
Анализировать и проверять параметры командной строки с помощью VB.NET
Я всегда добавляю /? параметр, чтобы получить помощь, и я всегда стараюсь иметь реализацию по умолчанию (то есть наиболее распространенный сценарий).
В противном случае я склонен использовать "/x" для переключателей и "/x: значение" для переключателей, которые требуют передачи значений. Облегчает анализ параметров с помощью регулярных выражений.
Я разработал эту структуру, может быть, это помогает:
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
Соглашения, которые вы используете для своего приложения, будут зависеть от
1) Какой тип приложения это.
2) Какую операционную систему вы используете. Linux? Окна? У них обоих разные соглашения.
Я бы посоветовал взглянуть на другие интерфейсы командной строки для других команд в вашей системе, обращая особое внимание на передаваемые параметры. Неправильные параметры должны дать пользователю сообщение об ошибке. Удобный экран справки также может помочь в удобстве использования.
Не зная, что именно сделает ваше приложение, сложно привести конкретные примеры.
Я создал библиотеку.Net C#, которая включает анализатор командной строки. Вам просто нужно создать класс, который наследуется от класса CmdLineObject, вызвать Initialize, и он автоматически заполнит свойства. Он может обрабатывать преобразования в различные типы (использует расширенную библиотеку преобразований, также включенную в проект), массивы, псевдонимы командной строки, аргументы с однократным нажатием и т. Д. Он даже автоматически создает справку командной строки (/?).
Если вы заинтересованы, URL-адрес проекта - http://bizark.codeplex.com/. В настоящее время он доступен только в виде исходного кода.
Я только что выпустил еще лучший парсер командной строки.
https://github.com/gene-l-thomas/coptions
Это на Nuget копии пакета установки
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
Наслаждаться.
-operation [параметры] -команда [ваша команда] -anotherthings [другие параметры]....
Например,
YourApp.exe -file %YourProject.prj% -Secure true
Если вы используете Perl, мой CLI::Application Framework может быть именно тем, что вам нужно. Он позволяет вам легко создавать приложения с пользовательским интерфейсом, подобным SVN/CVS/GIT ("your-command -o --long-opt some-action-to-execute Некоторые параметры").
Соглашения, которые вы используете для своего приложения, будут зависеть от
1) Какой тип приложения это. 2) Какую операционную систему вы используете.
Это определенно правда. Я не уверен в соглашениях о DOS-Prompt, но в Unix-подобных системах общие соглашения примерно такие:
1) Форматирование
параметры appName
2) Односимвольные параметры (такие как 'x') передаются как -x 3) Многосимвольные параметры (такие как 'add-keys') передаются как --add-keys
Если вы используете один из стандартных инструментов для генерации интерфейсов командной строки, например, getopts, то вы автоматически согласитесь.