建议实施一个命令行界面(Suggestions for implementation of a co

2019-06-25 03:52发布

我重新设计一个命令行应用程序,并正在寻找一种方式来使其使用更直观。 是否有传递到一个命令行应用程序的参数格式的任何约定? 或者说,人们已经发现有用的任何其他方法?

Answer 1:

我看到很多Windows命令行的细节,但如果你的程序是用于Linux的,我觉得GNU命令行的标准是最直观的。 基本上,它使用一个命令的长形式(例如,双连字符--help )和短版(例如,一个连字符-h )。 您也可以“堆叠”短版本一起(如tar -zxvf filename )和混合“东经匹配多空你的心脏的内容。

GNU的网站还列出了标准的选项名称 。

该getopt的图书馆大大简化解析这些命令。 如果C的不是你的包, Python中也有类似的图书馆一样, Perl的 。



Answer 2:

如果您使用的是C#试Mono.GetOptions ,这是一个非常强大和简单易用的命令行参数解析器。 它工作在单声道的环境,并与Microsoft .NET框架。

编辑:这里有几个特点

  • 每个PARAM有2只CLI表示(1个字符和字符串,例如-a或--add)
  • 默认值
  • 强类型
  • 自动地产生一个帮助屏幕,上面的说明
  • 自动地产生一个版本和版权屏幕


Answer 3:

有一件事我喜欢某些CLI是快捷键的使用。
即所有的以下行做同样的事情

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

通过这种方式,用户可以不必每次都输入了所有命令。



Answer 4:

一个很好的和有益的参考:

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
创建使用lambda表达式解析器实例。

快速入门: 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);
  }
}


Answer 5:

做最好的事情是,如果你可以不承担任何事情。 当你的应用程序名称操作类型的执行,并且没有任何参数,无论是打他们与一个使用情况块或在备选方案中打开Windows窗体,并允许他们进入你所需要的一切。

c:\>FOO

FOO

USAGE FOO -{Option}{Value}

-A Do A stuff
-B Do B stuff

c:\>

参数分界我把一个宗教主题的标题下:连字符(破折号),双连字符,斜线,什么都没有,位置等。

你没有注明您的平台,但在接下来的评论,我会承担Windows和.NET

您可以在.NET中创建一个基于控制台的应用程序,并允许它只是通过选择基于控制台的项目,然后加入Windows.Forms的,System.Drawing中,等DLL文件与桌面使用表单交互。

我们做这一切的时候。 这确保了没有人需要拒绝一个黑暗的胡同。



Answer 6:

命令行惯例有所不同操作系统的操作系统,但是这可能变得公约都使用最多,最公众的监督是由GNU getopt的包所支持的一个。 见http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html获取更多信息。

它允许你混合单字母的命令,如-nr,用较长,自我记录的选项,如--numeric --reverse。 是很好,并实施--help( - )选项,然后你的用户将能够找出他们需要知道的。



Answer 7:

这里有一个CodeProject上的文章可以帮助你了...

C#/。NET命令行参数解析器

如果VB是你的味道,这里有一个单独的文章(多一点指导相关内容)检查出...

用VB.NET解析和验证命令行参数



Answer 8:

补充@ vonc的回答,不接受模棱两可的缩写。 例如:

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

事实上,在这种情况下,我可能不会接受“消灭”的缩写...



Answer 9:

我总是添加/? 参数来获取帮助,我总是试图有一个默认的(即最常见的情况)执行。

否则,我倾向于使用“/ X”开关和“/ X:价值”为需要的值传递开关。 使得它非常容易解析使用正则表达式的参数。



Answer 10:

我开发这个框架,也许它可以帮助:

该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


Answer 11:

-operation [参数] -command [你的命令] -anotherthings [otherparams] ...

例如,

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


Answer 12:

如果你使用的标准工具之一生成的命令行界面,比如getopts的,那么你会自动地符合。



Answer 13:

你使用你的应用程序的约定将取决于

1)它是什么类型的应用程序。 2)什么操作系统您使用。

这是绝对真实的。 我不能确定有关DOS提示符约定,但在类Unix系统的一般约定是大致为:

1)格式是

APPNAME参数

2)单字符的参数(如“X”)为-x 3)多字符的参数(如“添加密钥”)被传递作为传递--add密钥



Answer 14:

你使用你的应用程序的约定将取决于

1)它是什么类型的应用程序。
2)什么操作系统您使用。 Linux呢? 视窗? 他们都有不同的约定。

我的建议是看你的系统上的其他命令,要特别注意传递的参数等命令行界面。 有不正确的参数应该给用户解决方案导向的错误消息。 一个容易找到帮助屏幕可以在易用性帮助为好。

如果不知道究竟你的应用程序会做,很难给出具体的例子。



Answer 15:

如果你正在使用Perl,我的CLI ::应用框架,可能正是你需要的。 它可以让你轻松地建立类似的用户界面与SVN / CVS / GIT应用程序(“您的命令-o --long-选择一些行动对执行一些参数”)。



Answer 16:

我创建了一个净C#库,其中包括一个命令行分析器。 你只需要创建一个从CmdLineObject类继承的类,调用初始化,它会自动填充属性。 它可以处理转换到不同类型的(采用了先进的转换库也包含在项目),数组,命令行别名,点击一次的参数等,甚至会自动创建命令行帮助(/?)。

如果你有兴趣,该URL的项目是http://bizark.codeplex.com 。 这是目前仅可作为源代码。



Answer 17:

我刚刚发布了一个更好的命令行分析器。
https://github.com/gene-l-thomas/coptions
这是对的NuGet 安装,包装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
请享用。



文章来源: Suggestions for implementation of a command line interface