代码之家  ›  专栏  ›  技术社区  ›  lillq

命令行接口的实现建议

  •  34
  • lillq  · 技术社区  · 16 年前

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

    17 回复  |  直到 7 年前
        1
  •  28
  •   yukondude    16 年前

    我看到了许多Windows命令行的细节,但是如果您的程序是针对Linux的,我发现 GNU command line standard 是最直观的。基本上,它使用双连字符作为命令的长形式(例如, --help )以及短版本的单个连字符(例如, -h )您还可以将短版本“堆叠”在一起(例如, tar -zxvf filename )长与短的搭配符合你的心意。

    GNU站点也列出了 standard option names .

    这个 getopt library 大大简化了对这些命令的解析。如果C不是你的包, Python 有一个类似的图书馆 Perl .

        2
  •  13
  •   Alfred Myers    11 年前

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

    编辑:以下是一些功能

    • 每个参数有2个CLI表示(1个字符和字符串,例如-a或--add)
    • 默认值
    • 强类型
    • 自动生成带有说明的帮助屏幕
    • 自动生成版本和版权屏幕
        3
  •  4
  •   VonC    16 年前

    我喜欢某些CLI的一点是 捷径 .
    也就是说,以下所有行都在做同样的事情

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

    这样,用户可能不必每次都输入all命令。

        4
  •  4
  •   Kiquenet user385990    9 年前

    一个好的有用的参考:

    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);
      }
    }
    
        5
  •  3
  •   Bill    16 年前

    如果可以的话,最好不要想当然。当操作员在应用程序名中键入要执行的操作,并且没有任何参数时,请使用一个用法块或在另一个选项中单击它们,打开一个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即可。

    我们一直这样做。这就保证了没有人在黑暗的小巷转弯。

        6
  •  3
  •   community wiki Kimbo    16 年前

    命令行约定在操作系统和操作系统之间各不相同,但可能得到最多使用和最公开的审查的约定是GNUgetopt包支持的约定。见 http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html 更多信息。

    它允许您将单字母命令(如-nr)与较长的自记录选项(如--numeric--reverse)混合使用。做个好人,实现一个--帮助(-?)选项,然后您的用户将能够了解他们需要知道的所有信息。

        7
  •  3
  •   Sean Gough    16 年前

    这是一篇代码项目文章,可能会帮助你…

    C#/.NET Command Line Arguments Parser

    如果你喜欢vb,这里有一篇单独的文章(有更多的指导相关内容)来查看…

    Parse and Validate Command Line Parameters with VB.NET

        8
  •  3
  •   Brent.Longborough    16 年前

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

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

    实际上,在这种情况下,我可能不会接受“destroy”的缩写…

        9
  •  2
  •   Sean Gough    16 年前

    我总是加一个/?获取帮助的参数,我总是尝试使用默认(即最常见的场景)实现。

    否则,我倾向于对开关使用“/x”,对需要传递值的开关使用“/x:value”。使使用正则表达式解析参数变得非常容易。

        10
  •  1
  •   Junior    7 年前

    我开发了这个框架,也许它有助于:

    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
    
        11
  •  0
  •   Graviton    16 年前

    -操作[参数]-命令[您的命令]-其他内容[其他参数]…

    例如,

    YourApp.exe -file %YourProject.prj% -Secure true
    
        12
  •  0
  •   jodonnell    16 年前

    如果您使用一个标准工具来生成命令行接口,比如getopts,那么您将自动遵从。

        13
  •  0
  •   donair    16 年前

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

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

    这绝对是真的。我不确定DOS提示约定,但在类Unix系统上,一般约定大致如下:

    1)格式为

    AppName参数

    2)单个字符参数(如“x”)作为-x传递 3)多字符参数(如'add keys')作为--add keys传递。

        14
  •  0
  •   Alan H    16 年前

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

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

    我建议您查看系统上其他命令的其他命令行接口,特别注意传递的参数。参数不正确会给用户提供解决方案导向的错误消息。一个容易找到的帮助屏幕也可以帮助在可用性。

    如果不知道应用程序将做什么,就很难给出具体的示例。

        15
  •  0
  •   jkramer    16 年前

    如果您使用的是Perl,我的 CLI::Application 框架可能正是您所需要的。它允许您轻松地使用类似SVN/CVS/Git的用户界面构建应用程序(“您的命令-o——long opt some action to execute some parameters”)。

        16
  •  0
  •   skolima    14 年前

    我创建了一个.NET C库,其中包含一个命令行分析器。您只需要创建一个继承自CmdLineObject类的类,调用Initialize,它将自动填充属性。它可以处理不同类型的转换(使用项目中还包含的高级转换库)、数组、命令行别名、单击一次参数等。它甚至可以自动创建命令行帮助(/?).

    如果您感兴趣,项目的URL是 http://bizark.codeplex.com . 它目前只能作为源代码使用。

        17
  •  0
  •   Gene    7 年前

    我刚刚发布了一个更好的命令行分析器。
    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;
                }
            }
        }
    }
    

    支持自动——帮助生成,动词,例如commmand.exe
    享受。