寻找.NET的命令行参数解析器


79

我正在寻找一个命令行参数解析器,例如http://www.sellsbrothers.com/tools/Genghis/中的“命令行解析器” 。

我要寻找的功能:

  • 自动生成用法
  • 应该能够检查必需和可选参数
  • 参数应支持IEnumerable,并带有分隔符支持
  • 应该支持标志参数
  • 很好地支持组合参数,例如“ / fx” ==“ / f / x”
  • 最好不要在参数“ /ftest.txt” ==“ / f test.txt”之后使用空格

PS: “命令行解析器”非常好,我真的很喜欢它的设计,但是没有文档,没有新的更新,而且我不敢做某些事情,例如如何检查所需的参数。


最灵活的.NET命令行解析器似乎是:gsscoder的CommandLineParser
AlexMelw,

Answers:


52

我个人最喜欢的第三方命令行解析库是Command Line Parser,我认为这就是您所指的。最新版本不到2个月前,并且有定期提交。如果您想要更成熟的产品,可以在mono项目中检查控制台库(很抱歉,目前似乎无法找到指向名称空间的直接链接,但这是mono框架的一部分)


1
看起来很棒,我会尝试的。
博士 邪恶的

我正在尝试实现此功能,它是否支持“标志”参数?例如“ -enable”,它不需要值就可以是真/假。我找不到
博士 邪恶的

如果我没记错的话,它并不是开箱即用的,但是修改解析器以查找布尔值的不合格开关应该不是太多的工作,而不是期望指定true / false。
拉乌尔

顺便说一下,单声道解析器称为Mono.GetOptions。绝对可以满足您的需求。您可以仅下载mono框架源的那部分内容并进行构建,并在项目中作为参考引用。
拉乌尔

我自己使用了这个库,并同意这是一个很棒的库。
Noldorin

20

看一下ndesk.options。

现在称为Mono.Options


3
我们已经成功使用了ndesk.options。这是一个单一的类,您可以将其编译为您的代码:ndesk.org/Options
Sean Carpenter 2009年

当前,他们的站点上有关于NDesk.Options不稳定的警告。只是警告...可能使用的是旧版本。
Kilhoffer

我对NDesk.Options也有很好的经验。它以Perl的Getopt :: Long(非常好)为模型。
2012年


4

遗憾的是,没有内置的支持以标准方式处理它。您是否研究过PowerShell?我敢打赌,该外壳中有一个类可以完全满足您的要求或类似的要求。


是的,在大多数情况下,PowerShell可能是最好的选择。编写cmdlet非常容易,但是却打开了很多可能性,几乎不需要完成任何工作。
约翰·桑德斯

我不太确定您通过研究Powershell是什么意思。它不是开源的,或者您是说我可能会找到一个cmdlet并将其转换为.NET语法。
博士 邪恶的

3
我认为他的意思是“将代码编写为PowerShell cmdlet,而不是独立的可执行文件。”
Joel Mueller

这些天我的默认行动计划是将面向命令行的程序编写为powershell cmdlet。这样,我不必担心如何解析命令行。
彼得·史蒂芬斯

我认为powerhell的arg解析太可怕了。
蒂姆·阿贝尔

2

编辑:正如fatcat1111指出的那样,.net 4.0的最终版本没有附带此功能。

C#4.0有一个非常不错的版本。可能还不是很有帮助,但是您可能要考虑研究一些能够轻松解决内置问题的方法。Bart De Smet在他的B#博客上谈到了它


2
System.Shell.CommandLine最终从Framework的v4中删除。
贾斯汀·R。2010年


1

考虑一下,一旦开始使用此解析器,您要么必须自己维护它,要么依赖其他人来为您维护它。从最关键,最直接的要求开始,您可能最好自己编写一个。我发现为我处理过的大多数基于控制台的应用程序生成一些相当复杂的命令行解析并不需要太多的工作。

我还发现,当解析变得太复杂时,可能是时候停止使用命令行了。


1
由于这是一个众所周知的问题,几乎是每个命令行工具所必需的,所以我假设应该有一些成熟的解决方案,并且维护和编写自己的声音会花费一些时间。但是,嘿,因为这里没有足够的答案,也许您是对的。
博士 邪恶的

1
@Downvoter:-2代表不打扰我。如果您想有所作为,请说明原因。
约翰·桑德斯

1

我敢打赌这并不是您想要的,但是:

这里有人遇到了这个问题,他的第一个念头是“嘿,ocaml有一个很好的东西!”,然后迅速将其移植到F#中。


+1 github.com/nessos/UnionArgParser是一个很好的例子
Ruben Bartelink 2014年

1

我正在使用C#3.0食谱之外的解析器。

本书中的所有示例都可以在这里下载:http : //examples.oreilly.com/9780596516109/

搜索“参数”,您将找到它。您必须进行一些小的代码更改才能将其从整个过程中移到您自己的类中,但这不是什么大问题。

它支持除最后两个点以外的所有点(参数合并和缺少空格)。


1

四海商舟库包含一个命令行分析器。

基本上,您只是创建一个从CmdLineObject继承的类,添加要从命令行填充的属性,将CmdLineArgAttribute添加到这些属性,然后在程序中调用Initialize。它也支持ClickOnce URL参数!

功能(来自站点)...

  • 自动初始化:类属性是根据命令行参数自动设置的。
  • 默认属性:发送一个值而不指定属性名称。
  • 值转换:使用BizArk中也包含的功能强大的ConvertEx类将值转换为正确的类型。
  • 布尔标志。可以通过简单地使用参数来指定标志(例如,/ b为true,/ b-为false),或者通过添加值true / false,yes / no等。
  • 参数数组。只需在命令行名称后添加多个值即可设置定义为数组的属性。例如,/ x 1 2 3将用数组{1,2,3}填充x(假设x被定义为整数数组)。
  • 命令行别名:一个属性可以支持多个命令行别名。例如,帮助使用别名?。
  • 部分名称识别。您无需拼写全名或别名,只需拼写足够使解析器将属性/别名与其他歧义区分开即可。
  • 支持ClickOnce:即使在URL中为已部署的ClickOnce应用程序将其指定为查询字符串,也可以初始化属性。命令行初始化方法将检测它是否以ClickOnce的形式运行,因此在使用它时无需更改代码。
  • 自动创建/?帮助:这包括很好的格式化,并考虑了控制台的宽度。
  • 将命令行参数加载/保存到文件:如果您要运行多个大型,复杂的命令行参数集,则此功能特别有用。

0

我是OptParse(使用Python内置库)的C#端口的粉丝。与这里的大多数其他建议相比,它使用起来相当简单,除了自动解析之外,还包含许多有用的功能。


0

你可能会喜欢我的一张地毯

易于使用且可扩展的命令行参数解析器。句柄:布尔,加号/减号,字符串,字符串列表,CSV,枚举。

内建'/?' 帮助模式。

内置'/ ??' 和'/?D'文档生成器模式。

static void Main(string[] args) 
{            
    // create the argument parser
    ArgumentParser parser = new ArgumentParser("ArgumentExample", "Example of argument parsing");

    // create the argument for a string
    StringArgument StringArg = new StringArgument("String", "Example string argument", "This argument demonstrates string arguments");

    // add the argument to the parser 
    parser.Add("/", "String", StringArg);

    // parse arguemnts
    parser.Parse(args);

    // did the parser detect a /? argument 
    if (parser.HelpMode == false) 
    {
        // was the string argument defined 
        if (StringArg.Defined == true)
        {
            // write its value
            RC.WriteLine("String argument was defined");
            RC.WriteLine(StringArg.Value);
        }
    }
}

编辑:这是我的项目,因此,此答案不应被视为第三方的认可。就是说,我确实将它用于我编写的每个基于命令行的程序,它是开源的,我希望其他人可以从中受益。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.