System.CommandLine 解析的值与输入不匹配

System.CommandLine parsed values don't match input

我正在尝试使用 System.CommandLine,但我无法让我的处理程序看到我传递的任何值。我尝试了最简单的命令行程序只是为了看看是否有任何价值观可以通过,但到目前为止我还没有成功。我的目标是 .NET 4.7.2,我正在使用 System.CommandLine 2.0.0-beta1.20574.7

    using System;
    using System.CommandLine;
    using System.CommandLine.Invocation;

    static class Program
    {
        public static void Main(string[] args)
        {
            var rootCommand = new RootCommand
            {
                new Option("--continue", "continue option")
            };

            rootCommand.Description = "Testing System.CommandLine";

            rootCommand.Handler = CommandHandler.Create<bool>
                ((willContinue) => run(willContinue));

            rootCommand.Invoke(args);
        }

        private static void run(bool willContinue)
        {
            Console.WriteLine(willContinue);
        }
    }

无论我如何调用我的应用程序,我都看不到 willContinue 的值是真的。

myapp.exe --continue -> False

myapp.exe --cont -> Unrecognized command or argument '--cont'(我的选择至少得到认可)

myapp.exe --continue true -> Unrecognized command or argument 'true'

myapp.exe --help ->

myapp:
Testing System.CommandLine

Usage:
myapp [options]

Options:
--continue continue option
--version Show version information
-?, -h, --help Show help and usage information

您需要解决 2 件事:

  1. 添加选项类型,为bool
  2. 更改选项名称以匹配参数名称

以下命令有效:

var rootCommand = new RootCommand
{
    new Option<bool>("--willContinue", "continue option")
};

然后这样称呼它

myapp.exe --willContinue true

选项名称和参数名称不一定总是匹配,但在这种情况下它不起作用,因为 'continue' 是保留字

我想添加一个答案,以便清楚地说明是什么解决了我的问题

using System;
using System.CommandLine;
using System.CommandLine.Invocation;

static class Program
{
    public static void Main(string[] args)
    {
        var rootCommand = new RootCommand
        {
            new Option("--willContinue", "continue option")
            //             ^This option name
        };

        rootCommand.Description = "Testing System.CommandLine";

        rootCommand.Handler = CommandHandler.Create<bool>
            ((WiLLCoNtInUe) => run(WiLLCoNtInUe));
        //     ^ HAS to match this parameter name where the command handler is created.
        //       but does not have to match case

        rootCommand.Invoke(args);
    }
 
    private static void run(bool canBeSomethingElse)
    // Because of how this is called ^ this does not have to match
    {
        Console.WriteLine(canBeSomethingElse);
    }
}

因为可以添加到 Command 对象的 Argument/Option/Command/anything else 必须与创建 CommandHandler 时使用的参数名称相匹配,所使用的名称不能有空格,以数字开头,或使用 C# 关键字(对于大多数项目来说,没有空格不是问题,因为 silly/impossible 有一个选项 --will continue,但是对于参数你不必将参数的名称放入命令行调用中,因为它在用法中列为 <argument name> 并且参数是按位置读取的,所以我想使用像 <file directory> 这样的参数名称,但是这是行不通的,因为你不能有一个包含空格的变量名)