当前位置:  开发笔记 > 编程语言 > 正文

在C#中解析命令行参数的最佳方法?

如何解决《在C#中解析命令行参数的最佳方法?》经验,为你挑选了8个好方法。

构建带参数的控制台应用程序时,可以使用传递给的参数Main(string[] args).

在过去,我只是索引/循环该数组并完成一些正则表达式来提取值.但是,当命令变得更复杂时,解析会非常难看.

所以我对以下内容感兴趣:

您使用的库

您使用的模式

假设命令始终遵循通用标准,例如此处的答案.



1> jonp..:

我强烈建议使用NDesk.Options(Documentation)和/或Mono.Options(相同的API,不同的命名空间).文档中的一个示例:

bool show_help = false;
List names = new List ();
int repeat = 1;

var p = new OptionSet () {
    { "n|name=", "the {NAME} of someone to greet.",
       v => names.Add (v) },
    { "r|repeat=", 
       "the number of {TIMES} to repeat the greeting.\n" + 
          "this must be an integer.",
        (int v) => repeat = v },
    { "v", "increase debug message verbosity",
       v => { if (v != null) ++verbosity; } },
    { "h|help",  "show this message and exit", 
       v => show_help = v != null },
};

List extra;
try {
    extra = p.Parse (args);
}
catch (OptionException e) {
    Console.Write ("greet: ");
    Console.WriteLine (e.Message);
    Console.WriteLine ("Try `greet --help' for more information.");
    return;
}


NDesk.options很棒,但似乎并不真正支持具有多个不同命令的控制台应用程序.如果你想要,尝试在NDesk.Options上构建的ManyConsole:http://nuget.org/List/Packages/ManyConsole
当我有一个具有多个不同命令的应用程序时,我"分层"了OptionSets.拿mdoc(http://docs.go-mono.com/index.aspx?link=man%3amdoc%281%29),它有一个"全局"OptionSet(https://github.com/mono/mono/委托给每个命令OptionSet的blob/master/mcs/tools/mdoc/Mono.Documentation/mdoc.cs#L54)(例如https://github.com/mono/mono/blob/master/mcs/tools/ MDOC/Mono.Documentation/monodocer.cs#L66)
NDesk对我没用.可以读取整数参数ok但不能读取字符串.变量不断获取参数(例如's','a'等)而不是参数值(例如'serverName','ApplicationName').放弃并使用'Command Line Parser Library'代替.好到目前为止.
@AshleyHenderson一方面,它小而灵活.大多数解决方案只能使用可选的命名参数(即,不能像`git checkout master`那样),或者它们的参数不灵活(即不支持`--foo 123` =`--foo = 123` =` -f 123` =`-f = 123`以及`-v -h` =`-vh`).

2> Adrian Grigo..:

我非常喜欢Command Line Parser Library(http://commandline.codeplex.com/).它有一种非常简单而优雅的方式来通过属性设置参数:

class Options
{
    [Option("i", "input", Required = true, HelpText = "Input file to read.")]
    public string InputFile { get; set; }

    [Option(null, "length", HelpText = "The maximum number of bytes to process.")]
    public int MaximumLenght { get; set; }

    [Option("v", null, HelpText = "Print details during execution.")]
    public bool Verbose { get; set; }

    [HelpOption(HelpText = "Display this help screen.")]
    public string GetUsage()
    {
        var usage = new StringBuilder();
        usage.AppendLine("Quickstart Application 1.0");
        usage.AppendLine("Read user manual for usage instructions...");
        return usage.ToString();
    }
}


这是我定居的图书馆.我写了一个大公司,需要加以保持多年的应用程序 - 该库自2005年以来在不断更新,似乎是流行,是由活跃在C#社区的人写的,并授权在BSD风格的情况下,支持确实消失了.
我发现这个库对我自己非常严格.如果您需要独占集,则无法为每个集定义所需的选项,因此必须手动检查它们.您无法为未命名的值定义最小要求,您也必须手动检查它们.帮助屏幕构建器也根本不灵活.如果库的行为不适合您的需求,您几乎无法改变它.
我刚刚测试了它,我在几分钟内就为我的应用程序实现了选项.使用库非常简单.

3> user7116..:

在WPF TestApi库配备了最好的命令行解析器C#开发的一个.我强烈建议您从Ivo Manolov关于API的博客中进行调查:

// EXAMPLE #2:
// Sample for parsing the following command-line:
// Test.exe /verbose /runId=10
// This sample declares a class in which the strongly-
// typed arguments are populated
public class CommandLineArguments
{
   bool? Verbose { get; set; }
   int? RunId { get; set; }
}

CommandLineArguments a = new CommandLineArguments();
CommandLineParser.ParseArguments(args, a);


+1.命令行解析实际上应该来自供应商(即微软),而不是通过第三方工具,即使供应商的支持是以全面的方式进行的.
@Joel,命令行解析必须来自供应商的重要部分是什么?你的理由是什么?
@marcias:我认为他的意思是它应该是开箱即用的...像很多东西:)
也就是说,接受的答案(单声道)是下一个最好的事情.

4> abatishchev..:

请查看http://github.com/mono/mono/tree/master/mcs/class/Mono.Options/


@Adam Oren:我的答案是1年零1个月!单声道干线的结构被重构.该代码现已放入http://anonsvn.mono-project.com/viewvc/branches/mono-2-2/mcs/class/Mono.Options/
@Tormod:它是过时的Mono.GetOptions,而不是Mono.Options.Mono.Options仍然保留.
NDesk选项有一个非常好的API
我将为NDesk添加另一个投票,它运作良好,非侵入性且有详细记录.

5> Brian..:

看起来每个人都有他们自己的宠物命令行解析器,图我最好添加我的:).

http://bizark.codeplex.com/

该库包含一个命令行解析器,它将使用命令行中的值初始化一个类.它有很多功能(我已经建立了很多年).

从文档 ......

BizArk框架中的命令行解析具有以下主要功能:

自动初始化:根据命令行参数自动设置类属性.

默认属性:发送值而不指定属性名称.

值转换:使用BizArk中包含的功能强大的ConvertEx类将值转换为正确的类型.

布尔标志:只需使用参数(ex,/ b表示true,/ b-表示false)或添加值true/false,yes/no等来指定标志.

参数数组:只需在命令行名称后添加多个值即可设置定义为数组的属性.Ex,/ x 1 2 3将使用数组{1,2,3}填充x(假设x被定义为整数数组).

命令行别名:属性可以为其支持多个命令行别名.例如,帮助使用别名?

部分名称识别:您不需要拼出全名或别名,只需拼写就足以使解析器消除其他属性/别名的歧义.

支持ClickOnce:即使将属性指定为ClickOnce部署的应用程序的URL中的查询字符串,也可以初始化属性.命令行初始化方法将检测它是否以ClickOnce运行,因此您的代码在使用时不需要更改.

自动创建/?帮助:这包括考虑控制台宽度的良好格式.

将命令行参数加载/保存到文件:如果您要多次运行多个大型复杂的命令行参数,这将非常有用.


我发现BizArk的命令行解析器比其他解析器更容易和流畅.强烈推荐!

6> 小智..:

我不久前写了一个C#命令行参数解析器.它位于:http://www.codeplex.com/CommandLineArguments



7> Colonel Pani..:

CLAP(命令行参数解析器)具有可用的API,并且记录得非常好.你创建了一个方法,注释参数. https://github.com/adrianaisemberg/CLAP


它的使用非常简单,网站也很简单.然而,它们的语法不是很直观:`myapp myverb -argname argvalue`(必须有`-argname`)或`myapp -help`(通常是`--help`).

8> csharptest.n..:

这个问题有很多解决方案.为了完整性并提供备选,如果有人想要我在谷歌代码库中添加两个有用的类的答案.

第一个是ArgumentList,它只负责解析命令行参数.它收集由开关'/ x:y'或'-x = y'定义的名称 - 值对,并且还收集'未命名'条目的列表.它的基本用法是这里讨论,查看这里的类.

第二部分是CommandInterpreter,它从.Net类中创建一个功能齐全的命令行应用程序.举个例子:

using CSharpTest.Net.Commands;
static class Program
{
    static void Main(string[] args)
    {
        new CommandInterpreter(new Commands()).Run(args);
    }
    //example ‘Commands’ class:
    class Commands
    {
        public int SomeValue { get; set; }
        public void DoSomething(string svalue, int ivalue)
        { ... }

使用上面的示例代码,您可以运行以下代码:

Program.exe DoSomething"字符串值"5

- 要么 -

Program.exe dosomething/ivalue = 5 -svalue:"string value"

它就像你需要的那样简单或复杂.您可以查看源代码,查看帮助或下载二进制文件.

推荐阅读
赛亚兔备_393
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有