如何将多个值传递给同一个 System.CommandLine 选项?

问题描述 投票:0回答:1

我想将几个数字传递给 C# 控制台应用程序,并准备了一个 .Net Fiddle 来演示我的问题:

private const long DEFAULT_ALPHA_VALUE = 1234567890L;
private static long[] alphas = { DEFAULT_ALPHA_VALUE };

public static async Task Main()
{
    Option<long[]> alphaOption = new
    (
        aliases: new[] { "-a", "--alpha" },
        getDefaultValue: () => new[] { DEFAULT_ALPHA_VALUE },
        description: "Numerical alpha values"
    );

    RootCommand rootCommand = new("A test app for multiple numerical values option");
    rootCommand.AddGlobalOption(alphaOption);
    rootCommand.SetHandler(a => { alphas = a; }, alphaOption);
    
    await RunInvokeAsync(rootCommand, "-a", "1234");
    await RunInvokeAsync(rootCommand, "-a", "1234", "5678"); // Unrecognized command or argument '5678'.
    await RunInvokeAsync(rootCommand, "-a", "1234 5678"); // Cannot parse argument '1234 5678' for option '-a' as expected type 'System.Int64'.
    await RunInvokeAsync(rootCommand, "-a", "1234,5678"); // Cannot parse argument '1234 5678' for option '-a' as expected type 'System.Int64'.
}

private static async Task RunInvokeAsync(RootCommand rootCommand, params string[] args)
{
    int status = await rootCommand.InvokeAsync(args);
    Console.WriteLine($"args: {JsonSerializer.Serialize(args)}, status: {status}, alphas: {JsonSerializer.Serialize(alphas)}");
}

我希望能够通过在 CLI 上运行以下命令之一来传递多个数字:

dotnet run --project MyTestProject.csproj --a 1234 5678
dotnet run --project MyTestProject.csproj --a 1234,5678

但是正如您在屏幕截图中看到的,存在运行时错误:

我的问题是:如何传递多个数字,我是否在 C# 代码中错误地选择了它们,或者我是否以错误的方式调用了 C# 应用程序?

c# .net-core command-line-interface command-line-arguments system.commandline
1个回答
0
投票

试试这个

    Option<long[]> alphaOption = new
    (
        aliases: new[] { "-a", "--alpha" },
        getDefaultValue: () => new[] { DEFAULT_ALPHA_VALUE },
        description: "Numerical alpha values"
    ){AllowMultipleArgumentsPerToken = true};

兴趣点是最后一行。

在这种情况下,将正确处理以下值

    await RunInvokeAsync(rootCommand, "-a", "1234");
    await RunInvokeAsync(rootCommand, "-a", "1234", "5678");

后两者仍然会失败,但这是预期的,因为您尝试使用“1234 5678”或“1234,5678”作为single参数,这显然是错误的并且无法解析为数字。要从命令行模拟此类情况,用户应使用额外的转义来明确告诉解释器将输入视为单个参数,因此对于开发人员来说这不应该成为问题。

© www.soinside.com 2019 - 2024. All rights reserved.