【问题标题】:How to only allow flag Option on cmd-line using CommandLineParser如何使用 CommandLineParser 只允许命令行上的标志选项
【发布时间】:2019-06-22 03:40:10
【问题描述】:

我正在使用 C# CommandLineParser 来处理我的命令行参数。

https://github.com/commandlineparser/commandline

我在命令行上允许的唯一选项是:

myprogram.exe -a 4 -b -c value

如果我不小心忘记了可选选项(参数)上的破折号,例如:

myprogram.exe -a b -c

程序仍然运行并且没有抱怨“b”。如果指定了这样的预期参数,我如何报告错误?我试过使用:

var parser = new CommandLine.Parser(s =>
{
    s.IgnoreUnknownArguments = false;
});

但这似乎并没有标记任何错误。想法?

【问题讨论】:

    标签: command-line-arguments command-line-parser


    【解决方案1】:

    我不熟悉 C# CommandLinePArser 类,但是从它的文档来看它与Apache Commons CLI 非常相似,所以我将根据相似性提供一个建议(这不应被视为完整的答案)。在您的情况下,程序不会抱怨“b”,因为它被视为选项“a”的参数。唯一的方法是在程序的解析阶段处理它。一种方法是查询命令行是否存在选项及其值,然后检查该值是否在该选项的允许空间内,请参阅the CLI command line querying。希望对您有所帮助。

    【讨论】:

    • 谢谢,不幸的是,选项“a”是一个布尔选项,所以无论如何它都不会期望它的参数。我开始认为必须有一种方法可以只询问 CommandLineParser,是否有任何位置参数......如果是这样,我必须标记一个错误。但是,除非我将它们添加到我的 POCO 类中,否则我找不到查看任何位置参数的方法,这没有任何意义,因为没有位置参数。 :-(
    【解决方案2】:

    FluentArgs(参见:https://github.com/kutoga/FluentArgs)有一个选项来控制这种行为。它使用预定义的错误消息,但可以自定义(在 Github 页面上搜索 RegisterParsingErrorPrinter)。您的代码看起来像(假设所有参数都是可选的):

    using FluentArgs;
    using System;
    
    namespace MyApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                FluentArgsBuilder.New()
                    .DisallowUnusedArguments()
                    .Parameter("-a").IsOptional()
                    .Parameter("-b").IsOptional()
                    .Parameter("-c").IsOptional()
                    .Call(c => b => a =>
                    {
                        Console.WriteLine($"a={a ?? "null"}");
                        Console.WriteLine($"b={b ?? "null"}");
                        Console.WriteLine($"c={c ?? "null"}");
                    })
                    .Parse(args);
            }
        }
    }
    

    我假设 abcstring 参数。如果它们是标志,可以这样做:

    using FluentArgs;
    using System;
    
    namespace MyApp
    {
        class Program
        {
            static void Main(string[] args)
            {
                args = new[] { "-a", "hey", "du" };
                FluentArgsBuilder.New()
                    .DisallowUnusedArguments()
                    .Flag("-a")
                    .Flag("-b")
                    .Flag("-c")
                    .Call(c => b => a =>
                    {
                        Console.WriteLine($"a={a}");
                        Console.WriteLine($"b={b}");
                        Console.WriteLine($"c={c}");
                    })
                    .Parse(args);
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-19
      • 2014-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多