C#/.NET 命令行参数解析器重载
易于使用但功能强大的命令行参数解析器,也可为用户创建用法和参数信息。
引言
许多程序使用命令行参数。每次都必须以相同的方式进行解析。还有其他项目可以帮助解析过程。 例如,C#/.NET 命令行参数解析器做得很好,但它缺少对传递和解析的参数的验证。 C# 命令行选项解析器可以做到这一点,但使用起来非常复杂。CLAParser
是两者的折衷方案:它易于使用,并使用正则表达式进行解析和验证,这使其非常强大。 此外,它还支持 i18n,并且它为用户创建正确的命令行用法信息。
命名约定
- 参数:通过参数行传递给程序的所有内容,用空格分隔或用引号分组,例如
program.exe argument1 /argument2 --argument3 .!§$argument4´ß2! "argument5 with spaces"
- 参数:所有以 / 或 - 开头的参数,例如
program.exe /parameter1 -parameter2
- 值:每个不是参数的参数,例如
program.exe value1 value2 /my_param 'v a l u e 3'
在最后一个示例中,value1
和 value2
是没有参数的值,而 v a l u e 3
属于参数 my_param
。(请注意,CLAParser
会删除将 'v a l u e 3'
组合在一起的单引号。)
Using the Code
- 将
CLAParser
文件复制到您的项目文件夹中,并将它们包含在 C# 项目中(CmdLineArgumentParser.cs,CmdLineArgumentParserRes.resx,以及可选的更多 resx 文件)。 - 通过调用构造函数创建
CLAParser
实例。CLAParser.CLAParser CmdLine = new CLAParser.CLAParser("CLAParserTest");
该参数必须是默认命名空间。(这是必要的,以便CLAParser
可以找到其 resx 文件。) - 使用
CmdLine.Parameter()
函数来定义已知的参数。CmdLine.Parameter(CLAParser.CLAParser.ParamAllowType.Optional, "", CLAParser.CLAParser.ValueType.String, "Path to file that is to be loaded on starting the program."); CmdLine.Parameter(CLAParser.CLAParser.ParamAllowType.Optional, "output", CLAParser.CLAParser.ValueType.OptionalString, "Write output to file, if no file specified default file output.txt is used."); CmdLine.Parameter(CLAParser.CLAParser.ParamAllowType.Required, "add", CLAParser.CLAParser.ValueType.MultipleInts, "Do a mathematical addition of number given integers.");
- 通过调用函数
CmdLine.Parse()
开始解析。引发的异常可以直接传递给用户。它们指示问题的原因。 此外,使用CmdLine.GetUsage()
和CmdLine.GetParameterInfo()
向用户显示正确的语法和有关参数的信息。try { CmdLine.Parse(); } catch (CLAParser.CLAParser.CmdLineArgumentException Ex) { Console.WriteLine(Ex.Message); Console.WriteLine(CmdLine.GetUsage()); Console.WriteLine(CmdLine.GetParameterInfo()); }
- 如果参数正确并且定义了所有必需的参数,则不会引发异常,并且可以通过字典接口访问所有参数的值。 用户未定义的可选参数由
null
值指示。 没有参数的值可以通过空字符串(“”)访问。if(CmdLine[""] != null) { value = CmdLine[""]; ... } if(CmdLine["parameter"] != null) { value = CmdLine["parameter"]; ... }
关注点
- 更新: 使用过时的函数
Parse(string[] Arguments)
将 args 作为参数引号(")必须转义 (\") 才能被正确识别。 建议改用函数Parse()
! - 函数
FindMismatchReasonInRegex()
有助于分析为什么搜索string
与正则表达式不匹配,并指示问题可能位于何处。 CLAParser
已国际化,即可以通过创建新的 resx 文件(本地化)轻松定义新语言。- 使用枚举器,可以遍历所有参数,例如
IEnumerator e = CmdLine.GetEnumerator(); while (e.MoveNext()) { DictionaryEntry arg = (DictionaryEntry)e.Current; Console.WriteLine(arg.Key + "=" + arg.Value); }
- 有关
CLAParser
功能的完整概述,请查看附加的代码文件。
历史
- 2010-02-24
- 首次发布
- 2010-04-05
- CmdLineArgumentParser.cs:574 -> 从 "
...Parameters == false)
" 到 "...Parameters == true)
"
- CmdLineArgumentParser.cs:574 -> 从 "
- 2011-01-06
- 更正了正则表达式中的错误,这使得不可能使用多个带引号的值
- 添加了 vermis0 提出的内部函数
GetRawCommandlineArgs()
。 与此同时,函数Parse()
使函数Parse(string[] Arguments)
过时。 现在,带引号的值(例如,“带有空格的值”)的引号不再需要转义!
- 2011-01-07
- 更正了正则表达式中的错误,这使得不可能使用不包含减号 (-) 或斜杠 (/) 的无参数值。
- 使没有参数的(第一个)值的行为更加一致。 不要设置
AllowValuesWithoutParameter
,而是使用Parameter()
函数,其中ParameterName==""
。 - 修复了参数区分大小写的问题。 现在一切都不区分大小写。
- 2011-09-09
- 更正了 Hautzendorfer 报告的关于单个参数未被正确处理的问题
- 2014-07-09
- 更正了 Gray John 报告的关于多个布尔参数未被正确处理的问题
- 2015-11-07
- 更正了检测无参数值的问题
- 添加了测试
- 2017-08-24
- 如果参数的帮助文本包含换行符 (\n),则增强格式
- 为
CLAParser
的嵌套用法添加了GetAdditionalParameters()
- 2020-09-29
- 修复了拼写错误
- 修复了编译器和代码规则警告
- 允许传递不带引号的负整数