80

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

我正在寻找的功能:

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

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

4

12 回答 12

53

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

于 2009-03-10T17:39:27.613 回答
20

看看 ndesk.options。

它现在称为Mono.Options

于 2009-03-26T12:47:24.577 回答
5

GNU getopt是一个流行且非常全面的 C 命令行解析器。这已多次移植(或克隆)用于 C#/.Net。其中一些包括:

任你选!还有其他几个,谷歌可以告诉你这些,

于 2009-03-26T13:07:16.477 回答
4

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

于 2009-03-10T17:27:06.350 回答
2

编辑:正如 fatcat1111 所指出的,这个特性没有随 .net 4.0 的最终版本一起提供。

C# 4.0 有一个相当不错的版本。可能还不是很有帮助,但是您可能需要考虑查看一些可以在它出现时轻松跳转到内置的东西。Bart De Smet 在他的B# 博客上谈到了它

于 2009-09-09T19:19:45.793 回答
2

我建议NDesk.Options

看这里:

在 C# 中解析命令行参数的最佳方法是什么?

于 2011-06-12T09:52:09.683 回答
1

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

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

于 2009-03-10T17:27:48.390 回答
1

我敢打赌这不是你要找的,但是:

这里有人遇到了这个问题,他的第一个想法是“嘿,ocaml 有一个不错的!”,并迅速将其移植到 F#。

于 2009-03-10T17:44:59.567 回答
1

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

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

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

它支持除最后两个点(参数组合和缺失空间)之外的所有点。

于 2009-03-12T12:58:24.510 回答
1

BizArk包含一个命令行解析器。

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

功能(来自网站)...

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

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

于 2009-09-09T19:23:49.000 回答
0

你可能喜欢我的一个Rug.Cmd

易于使用和可扩展的命令行参数解析器。句柄:布尔、加/减、字符串、字符串列表、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);
        }
    }
}

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

于 2012-01-23T17:13:34.520 回答