下面的简单Program.cs要求已定义的根命令只有一个参数:

using System.CommandLine;

var inputArgument = new Argument<string>(
  name: "--input", 
  description: "input any value and print it out");

var rootCommand = new RootCommand();
rootCommand.AddArgument(inputArgument);
rootCommand.SetHandler((inputArgumentValue) =>
{
  Console.WriteLine($"{inputArgumentValue}");
}, inputArgument);

rootCommand.Invoke(args);

我希望使用以下参数调用它:--input "Hello World"以在shell 中打印出Hello World.但是,我得到以下错误:

Unrecognized command or argument 'Hello World'.

当我将Argument类替换为Option类时,它按预期工作:

using System.CommandLine;

var inputArgument = new Option<string>(
  name: "--input", 
  description: "input any value and print it out");

var rootCommand = new RootCommand();
rootCommand.AddOption(inputArgument);
rootCommand.SetHandler((inputArgumentValue) =>
{
  Console.WriteLine($"{inputArgumentValue}");
}, inputArgument);

rootCommand.Invoke(args);

What did I misunderstand about the 100 class? Why can I not pass an argument with a value to it?


由于它的其他属性,我想使用参数类而不是选项.我使用的是.NET 6.0和System.CommandLine版本2.0.0-beta4.22272.1

推荐答案

看看这Command-line syntax overview for System.CommandLine份文档吧.

它将options定义为:

选项是可以传递给命令的命名参数.POSIX约定是在选项名前面加上两个连字符(--).

arguments作为:

参数是传递给选项或命令的值.

因此,基本上参数是传递给命令或选项的无名位置参数,也就是说,对于您的第一个代码段,有效调用将是:

appName "Hello World"

当然,您可以添加两个参数:

var inputArgument = new Argument<string>(
    name: "input", 
    description: "input any value and print it out");
var inputArgument2 = new Argument<string>(
    name: "input2", 
    description: "input any value and print it out");

var rootCommand = new RootCommand();
rootCommand.AddArgument(inputArgument);
rootCommand.AddArgument(inputArgument2);
rootCommand.SetHandler((inputArgumentValue, inputArgumentValue2) =>
{
    Console.WriteLine($"{inputArgumentValue} - {inputArgumentValue2}");
}, inputArgument, inputArgument2);

然后,您的appName --input "Hello World"调用将导致处理程序为inputArgumentValue获得2个值--input,为inputArgumentValue2获得"Hello World"个值.

但我认为使用Option<string>(第二个代码片段)应该是更正确的方法(它还允许传递以=:appName --input="Hello World"分隔的值).

Csharp相关问答推荐

Blazor在FluentButton onClick事件上设置参数

方法从数据表中只 Select 一个条件?

如何注册类使用多级继承与接口

Unix上的.NET(核心):.NET意外地未看到通过P/Invoke系统调用对环境变量进行的进程内修改

如何使用EF Core和.NET 8来upsert到具有多对多关系的表?

自定义列表按字符串的部分排序

基于C#方法的EF核心过滤查询(缓冲与流)

未显示详细信息的弹出对话框

如何在更新数据库实体时忽略特定字段?

我如何为我的Blazor应用程序构建一个动态教程标注?

将ValueTask发送给调用者

为什么LoadLibrary无法加载由vcpkg构建的OpenCV_world DLL,而不是预构建的二进制版本?

从系统中获取值__C中的对象#

new()和new class()之间的区别C#

Any()是否进行额外的数据库调用?

在整个代码库中用 C# 别名类型替换 CLR 类型

通过属性和数组内容来区分

EF Core 在 SaveChanges 中检测父级的子级更改

C# struct 体参数和局部变量默认对齐吗?

密码错误仍会将您带到下一页