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
	- 修复了拼写错误
- 修复了编译器和代码规则警告
- 允许传递不带引号的负整数
 




