O seguinte simples Program.cs
espera um único argumento para um comando root definido:
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);
Eu esperaria chamar isso com o seguinte parâmetro: --input "Hello World"
imprimir Hello World no shell. No entanto, recebo o seguinte erro:
Unrecognized command or argument 'Hello World'.
Quando substituo a classe Argument pela Option , funciona conforme o esperado:
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);
O que eu entendi mal sobre a Argument
aula? Por que não consigo passar um argumento com um valor para ele?
Quero usar a classe de argumento em vez de opções devido às suas outras propriedades. Estou usando .NET 6.0 e System.CommandLine versão 2.0.0-beta4.22272.1
Confira a visão geral da sintaxe da linha de comando para documentos System.CommandLine.
Ele define opções como:
E argumentos como:
Então, basicamente, o argumento é um parâmetro posicional sem nome passado para o comando ou opção, ou seja, para o seu primeiro trecho, a chamada válida seria:
É claro que você pode adicionar 2 argumentos:
Então, sua
appName --input "Hello World"
invocação resultará na obtenção de 2 valores--input
parainputArgumentValue
e"Hello World"
parainputArgumentValue2
.Mas eu diria que usar
Option<string>
(o segundo trecho) deveria ser uma abordagem mais correta (também permitirá passar valores delimitados por=
:appName --input="Hello World"
).