65.9K
CodeProject 正在变化。 阅读更多。
Home

C#/.NET 命令行参数解析器重载

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (30投票s)

2010年3月5日

CPOL

3分钟阅读

viewsIcon

111600

downloadIcon

1915

易于使用但功能强大的命令行参数解析器,也可为用户创建用法和参数信息。

引言

许多程序使用命令行参数。每次都必须以相同的方式进行解析。还有其他项目可以帮助解析过程。 例如,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'

在最后一个示例中,value1value2 是没有参数的值,而 v a l u e 3 属于参数 my_param。(请注意,CLAParser 会删除将 'v a l u e 3' 组合在一起的单引号。)

Using the Code

  1. CLAParser 文件复制到您的项目文件夹中,并将它们包含在 C# 项目中(CmdLineArgumentParser.csCmdLineArgumentParserRes.resx,以及可选的更多 resx 文件)。

    project explorer

  2. 通过调用构造函数创建 CLAParser 实例。
    CLAParser.CLAParser CmdLine = new CLAParser.CLAParser("CLAParserTest");
    该参数必须是默认命名空间。(这是必要的,以便 CLAParser 可以找到其 resx 文件。)
  3. 使用 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.");
  4. 通过调用函数 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());
    }
  5. 如果参数正确并且定义了所有必需的参数,则不会引发异常,并且可以通过字典接口访问所有参数的值。 用户未定义的可选参数由 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)"
  • 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
    • 修复了拼写错误
    • 修复了编译器和代码规则警告
    • 允许传递不带引号的负整数
© . All rights reserved.