实现命令行界面的建议

时间:2008-09-20 16:56:07

标签: command-line user-interface

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

17 个答案:

答案 0 :(得分:28)

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

GNU网站还列出了standard option names

getopt library极大地简化了解析这些命令的过程。如果C不是你的包,Python有一个类似的库,Perl也是如此。

答案 1 :(得分:13)

如果您正在使用C#try Mono.GetOptions,那么它是一个非常强大且易于使用的命令行参数解析器。它适用于Mono环境和Microsoft .NET Framework。

编辑:以下是一些功能

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

答案 2 :(得分:4)

我喜欢某些CLI的一个方面是使用快捷方式 即,以下所有行都在做同样的事情

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

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

答案 3 :(得分:4)

一个好的和有用的参考:

https://commandline.codeplex.com/

NuGet提供的图书馆:

  1. 最新稳定版:Install-Package CommandLineParser
  2. 最新发布:Install-Package CommandLineParser -pre
  3. 使用默认单例解析一行: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);
      }
    }
    

答案 4 :(得分:3)

最好的办法是尽可能不承担任何责任。当操作员键入您的应用程序名称以执行并且没有任何参数时,可以使用USAGE块命中它们,或者在替代方法中打开Windows窗体并允许它们输入您需要的所有内容。

c:\>FOO

FOO

USAGE FOO -{Option}{Value}

-A Do A stuff
-B Do B stuff

c:\>

参数分隔我置于宗教话题的标题下:连字符(短划线),双连字符,斜线,无,位置等。

您没有指明您的平台,但是对于下一个评论,我将假设Windows和.net

您可以在.net中创建基于控制台的应用程序,并允许它使用Forms与桌面交互,只需选择基于控制台的项目,然后添加Windows.Forms,System.Drawing等DLL。

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

答案 5 :(得分:3)

这是一篇可能会帮助你的CodeProject文章......

C#/.NET Command Line Arguments Parser

如果VB是你的风格,这里有一篇单独的文章(有更多的指导相关内容)来检查......

Parse and Validate Command Line Parameters with VB.NET

答案 6 :(得分:3)

命令行约定因操作系统而异,但可能得到最多使用和最公开审查的约定是GNU getopt包支持的约定。有关详细信息,请参阅 http://www.gnu.org/software/libc/manual/html_node/Using-Getopt.html

它允许您将单个字母命令(如-nr)与较长的自记录选项(如--numeric --reverse)混合使用。很好,并实现--help( - ?)选项,然后您的用户将能够找出他们需要知道的所有内容。

答案 7 :(得分:3)

补充@ vonc的答案,不要接受含糊不清的缩写。例如:

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

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

答案 8 :(得分:2)

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

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

答案 9 :(得分:1)

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

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

答案 10 :(得分:0)

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

答案 11 :(得分:0)

-operation [parameters] -command [your command] -anotherthings [otherparams] ....

例如,

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

答案 12 :(得分:0)

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

如果您感兴趣,项目的网址为http://bizark.codeplex.com。它目前仅作为源代码提供。

答案 13 :(得分:0)

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

答案 14 :(得分:0)

  

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

     

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

这绝对是真的。我不确定dos-prompt约定,但在类似unix的系统上,一般约定大致是:

1)格式化

  
    

appName参数

  

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

传递

答案 15 :(得分:0)

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

1)它是什么类型的应用。
2)您正在使用的操作系统。 Linux呢?视窗?它们都有不同的惯例。

我建议的是查看系统上其他命令的其他命令行界面,特别注意传递的参数。参数不正确应该为用户提供解决方案定向错误消息。易于查找的帮助屏幕也有助于实现可用性。

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

答案 16 :(得分:0)

如果您使用其中一个标准工具生成命令行界面,例如getopts,那么您将自动符合。