寻找一个适用于.NET的命令行参数解析器

82

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

以下是我需要的功能:

  • 自动生成用法说明
  • 应该能够检查必需和可选参数
  • 参数应支持带分隔符的IEnumerable
  • 应支持标志参数
  • 最好支持组合参数,如 "/fx" == "/f /x"
  • 最好不要强制在参数后面加上空格,如 "/ftest.txt" == "/f test.txt"

附注: "Command line parser"非常好,我真的很喜欢它的设计,但没有文档,也没有新的更新,并且我无法弄清楚如何检查必需参数。


目前最灵活的.NET命令行解析器似乎是:gsscoder的CommandLineParser - AlexMelw
12个回答

54

我个人最喜欢的第三方命令行解析库是Command Line Parser,我假设这就是你所指的。最近的版本发布时间不到2个月,有定期提交更新。如果你想要一个更成熟的选择,可以查看Mono项目中的控制台库(抱歉,目前我找不到该命名空间的直接链接,但它是Mono框架的一部分)。


我正在尝试实现这个功能,它支持“标志”参数吗?比如“-enable”,它不需要一个值,只是真/假的东西。我找不到它。 - dr. evil
我自己使用过这个库,同意它是一个优秀的库。 - Noldorin
@Dr. Evil,是的,它支持布尔开关。你不需要做任何特殊的事情。在下载包中附带的示例代码中有一个-i开关的示例。 - dan-gph
这是一个相当不错的库。感谢您的提示。不过,更好的方式是提供一个解析器,使得应用程序在运行时可以从参数中设置应用程序设置文件。这样一来,我们就可以摆脱为支持该库而需要编写额外类代码的麻烦了。 - Tom W
与此同时,.NET团队也在开发一款命令行API——System.CommandLine(目前还处于预览版)。 - Sil
显示剩余4条评论

21

请查看 ndesk.options。

现在它被称为 Mono.Options


3
我们在许多场合使用ndesk.options,获得了很多成功。这是一个可以编译到您的代码中的单个类:http://www.ndesk.org/Options - Sean Carpenter
目前,他们的网站警告NDesk.Options不稳定。只是一个警告...也许使用旧版本。 - Kilhoffer
我也对NDesk.Options有着良好的使用经验。它是以Perl的Getopt::Long为模型(这个库非常出色)。 - jwd

5

一个流行且相当全面的C命令行解析器是GNU getopt。它已经被移植(或克隆)到了C#/.Net上多次。其中一些包括:

选择你喜欢的吧!还有其他几个,谷歌可以告诉你。


4

不幸的是,标准方式中没有内置支持处理此问题。你有研究过PowerShell吗?我敢打赌,在那个shell中有一个类可以完全满足你的需求或者类似的功能。


是的,在大多数情况下,PowerShell 可能是最好的选择。编写 cmdlet 相当容易,但可以在很少或没有工作的情况下打开许多可能性。 - John Saunders
我不太确定你所说的“查看PowerShell”的意思。它不是开源的,或者你是指我可以找到一个cmdlet并将其转换为.NET语法。 - dr. evil
3
他的意思是“将你的代码编写成PowerShell cmdlet而不是独立可执行文件。” - Joel Mueller
我现在的默认操作计划是编写基于命令行的程序作为PowerShell cmdlet。这样我就不必担心命令行的解析方式了。 - Peter Stephens
我认为PowerShell的参数解析很糟糕。 - Tim Abell

3

-1 是 https://dev59.com/u3RB5IYBdhLWcg3wa2m2#685626 的重复内容。 - Ruben Bartelink

2

编辑:正如fatcat1111所指出的那样,这个功能并没有随着最终版本的.NET 4.0一起发布。

C# 4.0已经有了一个相当不错的功能。现在可能还不是非常有用,但你可能想考虑看看一些可以使转换到内置功能成为轻松的事情。Bart De Smet在他的B#博客上谈论了这个问题。


2
System.Shell.CommandLine在Framework v4中被删除了。 - Justin R.

1

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

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

特点(来自网站)...

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

1

请注意,一旦您开始使用此解析器,您要么必须自己维护它,要么依赖他人为您维护。最好从您最关键、最紧急的需求开始编写自己的解析器。我发现,对于我所工作的大多数基于控制台的应用程序来说,产生一些相当复杂的命令行解析并不需要太多的工作。

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


1
既然这是一个众所周知的问题,几乎所有的命令行工具都必须解决,我认为应该有一些成熟的解决方案,而且维护和编写自己的解决方案需要花费一些时间。但是嘿,既然这里没有足够的答案,也许你是对的。 - dr. evil
2
@Downvoter:-2声望对我来说无所谓。如果你想有所作为,请说明下降投票的原因。 - John Saunders

1

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

这里有个人遇到了同样的问题,他第一个想法是“嘿,ocaml有一个相当不错的解决方案!”,然后很快将其移植到了F#。


+1 github.com/nessos/UnionArgParser 是一个相当不错的例子。 - Ruben Bartelink

1

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

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

搜索“Arguments”,你就会找到它。你需要对代码进行一些小的更改,将其从整个内容中提取到自己的类中,但这不是什么大问题。

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


https://resources.oreilly.com/examples/9780596516109/-/blob/master/CSharpRecipes/03_ClassAndStructs.cs 是直接的URL。它很有趣。 - Charlesdwm

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