寻找 .NET 的命令行参数解析器 [关闭]

Posted

技术标签:

【中文标题】寻找 .NET 的命令行参数解析器 [关闭]【英文标题】:Looking for a Command Line Argument Parser for .NET [closed] 【发布时间】:2010-10-12 11:56:39 【问题描述】:

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

我正在寻找的功能:

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

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

【问题讨论】:

最灵活的.NET命令行解析器似乎是:gsscoder's CommandLineParser 【参考方案1】:

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

【讨论】:

这个看起来不错,我试试看。 我正在尝试实现这一点,它是否支持“标志”参数?例如“-enable”,它不需要值只是真/假的东西。我没找到。 如果我没记错的话,它不是开箱即用的,但是修改解析器以查找布尔值的不合格开关而不是期望 true / false 应该不会是太多工作指定。 单声道解析器被称为Mono.GetOptions。这绝对支持您正在寻找的东西。您可以只下载 mono 框架源代码的那一部分并构建它并在您的项目中引用它作为替代方案。 我自己使用过这个库,并且同意它是一个优秀的库。【参考方案2】:

查看 ndesk.options。

现在叫Mono.Options。

【讨论】:

我们已经成功使用了 ndesk.options。这是一个可以编译到代码中的类:ndesk.org/Options 目前,他们的网站有一个关于 NDesk.Options 不稳定的警告。只是一个警告......也许使用旧版本。 我对 NDesk.Options 也有很好的体验。它以 Perl 的 Getopt::Long 为模型(非常棒)。【参考方案3】:

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

getopt#freshmeat.net C# getopt phpGuru XGetoptCS 在 CodeProject 上 GetOpt for .NET 在 CodeProject 上 Getopt C#.NET 在 Codeplex 上

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

【讨论】:

【参考方案4】:

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

【讨论】:

是的,PowerShell 可能是大多数情况下的最佳选择。编写 cmdlet 相当容易,但也能带来很多可能性,而且几乎不需要工作。 我不太清楚你通过查看 powershell 是什么意思。它不是开源的,或者你的意思是我可能会找到一个 cmdlet 并将其转换为 .NET 语法。 我认为他的意思是“将您的代码编写为 PowerShell cmdlet 而不是独立的可执行文件。” 我这些天的默认行动计划是将面向命令行的程序编写为 powershell cmdlet。这样我就不用担心命令行是如何解析的了。 我觉得powerhell的arg解析太可怕了。【参考方案5】:

编辑: 正如 fatcat1111 指出的那样,此功能并未随 .net 4.0 的最终版本一起提供。

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

【讨论】:

System.Shell.CommandLine 最终从框架的 v4 中删除。【参考方案6】:

我建议NDesk.Options

看这里:

Best way to parse command line arguments in C#?

【讨论】:

-1 与***.com/a/685626/11635 重复【参考方案7】:

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

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

【讨论】:

由于这是一个众所周知的问题,并且几乎是每个命令行工具的必备条件,我假设应该有一些成熟的解决方案,并且维护和编写我自己的声音有点花费我的时间。但是,嘿,既然这里没有足够的答案,也许你是对的。 @Downvoter:-2 rep 不会打扰我。如果您想有所作为,请给出拒绝投票的原因。【参考方案8】:

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

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

【讨论】:

+1 github.com/nessos/UnionArgParser 就是一个很好的例子【参考方案9】:

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

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

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

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

【讨论】:

【参考方案10】:

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

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

功能(来自网站)...

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

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

你可能会喜欢我的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);
        
    

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

【讨论】:

以上是关于寻找 .NET 的命令行参数解析器 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

解析命令行参数的最佳方法是啥? [关闭]

解析命令行参数的最佳方法是啥? [关闭]

在 C++ 中解析命令行参数? [关闭]

在 C++ 中解析命令行参数? [关闭]

具有互斥必需参数的命令行解析器

使用子解析器时,命令行参数被默认值覆盖