在C#中解析命令行参数/选项

时间:2017-04-05 13:32:00

标签: c# parsing command-line-parser qcommandlineparser

我有一个带有一些参数和选项的控制台应用程序,所以我想使用免费的第三方库。

我找到了两个用于此目的的库:NDesk.OptionsCommand Line Parser Library

最后我决定使用Command Line Parser Library,因为它使用属性更清晰,所以我已下载并添加了对它的引用。

问题是,在添加对.NET Framework 3.5项目的引用时,我会收到一个警告图标。从上面我下载的页面,它说兼容性是.NET Framework 3.5+所以我理解3.5是兼容的,我是对的吗?如果不是哪个以前的版本与.NET Framework 3.5兼容?

3 个答案:

答案 0 :(得分:3)

您还可以使用新的 Microsoft CommandLineUtils 库。 nuget包在这里,但仅适用于.NET Core或Framrwork 4.5.2。 但您可以下载源代码(仅7个文件)并包含在您的项目中。对于Framework 3.5,您只需要解决2个编译错误:删除一个额外的方法(使用Tasks)并删除一行(在HandleUnexpectedArg中)。

要使用此库,请在此处找到第一个示例:

static void Main(string[] args)
{
    var cmd = new CommandLineApplication();
    var argAdd = cmd.Option("-a | --add <value>", "Add a new item", CommandOptionType.SingleValue);

    cmd.OnExecute(() =>
    {
        Console.WriteLine(argAdd.Value());
        return 0;
    });

    cmd.HelpOption("-? | -h | --help");
    cmd.Execute(args);            
}

答案 1 :(得分:1)

我推荐 FluentArgs (请参阅:https://github.com/kutoga/FluentArgs)。我认为它非常易于使用:

namespace Example
{
    using System;
    using System.Threading.Tasks;
    using FluentArgs;

    public static class Program
    {
        public static Task Main(string[] args)
        {
            return FluentArgsBuilder.New()
                .DefaultConfigsWithAppDescription("An app to convert png files to jpg files.")
                .Parameter("-i", "--input")
                    .WithDescription("Input png file")
                    .WithExamples("input.png")
                    .IsRequired()
                .Parameter("-o", "--output")
                    .WithDescription("Output jpg file")
                    .WithExamples("output.jpg")
                    .IsRequired()
                .Parameter<ushort>("-q", "--quality")
                    .WithDescription("Quality of the conversion")
                    .WithValidation(n => n >= 0 && n <= 100)
                    .IsOptionalWithDefault(50)
                .Call(quality => outputFile => inputFile =>
                {
                    /* ... */
                    Console.WriteLine($"Convert {inputFile} to {outputFile} with quality {quality}...");
                    /* ... */
                    return Task.CompletedTask;
                })
                .ParseAsync(args);
        }
    }
}

github页面上还有许多其他示例。

答案 2 :(得分:1)

McMaster.Extensions.CommandLineUtils 是我用过的最好的 c# 命令行解析器。我特别喜欢它很好地支持子命令。

源代码在这里:https://github.com/natemcmaster/CommandLineUtils

dotnet add package McMaster.Extensions.CommandLineUtils

这是一个如何使用属性使用它的简单示例:

using System;
using McMaster.Extensions.CommandLineUtils;

public class Program
{
    public static int Main(string[] args)
        => CommandLineApplication.Execute<Program>(args);

    [Option(Description = "The subject")]
    public string Subject { get; } = "world";

    [Option(ShortName = "n")]
    public int Count { get; } = 1;

    private void OnExecute()
    {
        for (var i = 0; i < Count; i++)
        {
            Console.WriteLine($"Hello {Subject}!");
        }
    }
}

或者您可以使用构建器:

using System;
using McMaster.Extensions.CommandLineUtils;

var app = new CommandLineApplication();

app.HelpOption();

var subject = app.Option("-s|--subject <SUBJECT>", "The subject", CommandOptionType.SingleValue);
subject.DefaultValue = "world";

var repeat = app.Option<int>("-n|--count <N>", "Repeat", CommandOptionType.SingleValue);
repeat.DefaultValue = 1;

app.OnExecute(() =>
{
    for (var i = 0; i < repeat.ParsedValue; i++)
    {
        Console.WriteLine($"Hello {subject.Value()}!");
    }
});

return app.Execute(args);

Microsoft 也一直在开发命令行解析器:https://github.com/dotnet/command-line-api,但它已经预览了很长时间。