命令行界面实现的建议

37

我正在重新设计一个命令行应用程序,希望找到一种使其使用更加直观的方法。有没有关于命令行应用程序参数格式的惯例?或者其他人发现有用的任何方法?


5
了解您的目标环境可能会有所帮助。 - dmckee --- ex-moderator kitten
17个回答

0

我刚发布了一个更好的命令行解析器。
https://github.com/gene-l-thomas/coptions
在NuGet上可以找到Install-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
尽情享受。


你的链接出现了问题,所以没有附带文档。顺带一提,你的库似乎是gsscoder命令行解析器的一个克隆... - AlexMelw
1
在开始编码之前,我先看了一下 command lineclipr 这两个库,因为它们都使用注解。虽然 clipr 的代码质量更好,API 更整洁,但我还是对其进行了大量扩展,添加了 [Flag](不带值的选项),并使用了更合理的 [Option] 和 [Value] 命名。现在,我已经支持通过填充字段来解析参数(减少输入),同时支持 /windows 和 -x11 样式的选项,以及解析 .ini 文件。项目链接:https://github.com/GeneThomas/coptions。 - Gene

0
我创建了一个包含命令行解析器的 .Net C# 库。你只需要创建一个继承自 CmdLineObject 类的类,调用 Initialize 方法,它就会自动填充属性。它可以处理不同类型的转换(使用项目中还包括的高级转换库),数组,命令行别名,单击一次参数等。它甚至会自动创建命令行帮助(/?)。
如果你感兴趣,该项目的 URL 是 http://bizark.codeplex.com。目前仅提供源代码。

0

-操作[参数] -命令[你的命令] -其他事项[其他参数]....

例如,

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

0
如果您使用生成命令行界面的标准工具之一,例如getopts,则会自动符合要求。

0

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

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

我建议你查看其他命令行界面上的其他命令,特别注意传递的参数。错误的参数应该给用户提供解决方案导向的错误消息。易于找到的帮助屏幕也可以提高可用性。

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


为什么我编写的程序要考虑是在Linux还是Windows上运行?我认为应该有一种通用的标准格式。如果您对此有更深入的见解并愿意分享,欢迎与我联系。 - lillq
这很重要,因为这两个操作系统的处理方式不同。例如,在命令行应用程序中使用参数时,Linux 使用“-”,而 Windows 使用“/”来指定开关。Unix 中是“ls -l”,Windows 中是“dir /ah”。这只是其中一个区别。 - user146043
@lillq 或许两者之间应该有一个共享格式,但实际上并没有。 - jwg

0
你所使用的应用程序约定取决于以下两点:
1)它是什么类型的应用程序。
2)你使用的操作系统是什么。
这绝对是正确的。我不确定dos-prompt的约定,但在类Unix系统上,一般的约定大致如下:
1)格式为
appName parameters
2)单个字符参数(例如“x”)作为-x传递
3)多字符参数(例如“add-keys”)作为--add-keys传递。

0
如果您正在使用Perl,我的CLI :: Application框架可能正是您所需要的。它可以让您轻松地构建具有类似于SVN / CVS / GIT用户界面的应用程序(“your-command -o --long-opt some-action-to-execute some parameters”)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接