CommandLineParser — значение не меняется

#c# #command-line-arguments

#c# #аргументы командной строки

Вопрос:

Я создал небольшой проект, который использует библиотеку CommandLineParser.

Я взял небольшой фрагмент кода из руководства по C # Quick Start:

 using System;
using CommandLine;

namespace QuickStart
{
    class Program
    {
        public class Options
        {
            [Option('v', "verbose", Required = false, HelpText = "Set output to verbose messages.")]
            public bool Verbose { get; set; }
        }

        static void Main(string[] args)
        {
            Parser.Default.ParseArguments<Options>(args)
                   .WithParsed<Options>(o =>
                   {
                       if (o.Verbose)
                       {
                           Console.WriteLine($"Verbose output enabled. Current Arguments: -v {o.Verbose}");
                           Console.WriteLine("Quick Start Example! App is in Verbose mode!");
                       }
                       else
                       {
                           Console.WriteLine($"Current Arguments: -v {o.Verbose}");
                           Console.WriteLine("Quick Start Example!");
                       }
               });
        }
    }
}
  

Я могу запустить программу через command promt с

 dotnet CommandLineParserTestProject.dll
  

Результат соответствует ожидаемому:

 Current Arguments: -v False
Quick Start Example!
  

Когда я затем поместил:

 dotnet CommandLineParserTestProject.dll -v true
  

Результат снова соответствует ожидаемому:

 Verbose output enabled. Current Arguments: -v True
Quick Start Example! App is in Verbose mode!
  

Теперь проблема:

После этих двух команд сверху я ввожу:

 dotnet CommandLineParserTestProject.dll -v false
  

но вывод тогда все еще:

 Verbose output enabled. Current Arguments: -v True
Quick Start Example! App is in Verbose mode!
  

Только когда я ввожу, dotnet CommandLineParserTestProject.dll false оно меняется, dotnet CommandLineParserTestProject.dll -v false похоже, не работает.

Кто-нибудь знает, почему это происходит?

Комментарии:

1. По-видимому, это должно быть bool? ( Nullable<bool> ), чтобы работать так, как вы ожидаете

Ответ №1:

Логические параметры командной строки не принимают параметров (т. Е. true / false); вы либо включаете их, либо нет. Поэтому параметр true / false в конце вашей командной строки игнорируется. Подробный вывод включается, когда анализатор видит параметр -v, и отключается, когда вы опускаете -v из командной строки.

Возвращаясь к документации, вам следует рассмотреть возможность обработки нераспределенных параметров рекомендуемым способом:

 .WithNotParsed<Options>((errs) => HandleParseError(errs));
  

… который сообщил бы вам, что ваши параметры true / false игнорировались.