在构建接受参数的控制台应用程序时,可以使用传递给Main的参数(string[] args)。
在过去,我只是简单地索引/循环该数组,并做了一些正则表达式来提取值。然而,当命令变得更加复杂时,解析就会变得非常糟糕。
我感兴趣的是:
你使用的库 你使用的模式
假设命令总是遵循常见的标准,比如这里回答的。
在构建接受参数的控制台应用程序时,可以使用传递给Main的参数(string[] args)。
在过去,我只是简单地索引/循环该数组,并做了一些正则表达式来提取值。然而,当命令变得更加复杂时,解析就会变得非常糟糕。
我感兴趣的是:
你使用的库 你使用的模式
假设命令总是遵循常见的标准,比如这里回答的。
当前回答
我个人最喜欢的是Peter palota的http://www.codeproject.com/KB/recipes/plossum_commandline.aspx:
[CommandLineManager(ApplicationName="Hello World",
Copyright="Copyright (c) Peter Palotas")]
class Options
{
[CommandLineOption(Description="Displays this help text")]
public bool Help = false;
[CommandLineOption(Description = "Specifies the input file", MinOccurs=1)]
public string Name
{
get { return mName; }
set
{
if (String.IsNullOrEmpty(value))
throw new InvalidOptionValueException(
"The name must not be empty", false);
mName = value;
}
}
private string mName;
}
其他回答
这个问题有很多解决方案。为了完整性和提供替代方案,如果有人需要,我在我的谷歌代码库中添加了两个有用的类的答案。
第一个是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)
{ ... }
使用上面的示例代码,您可以运行以下代码:
exe DoSomething“字符串值
——或——
Program.exe dosomething /ivalue=5 -svalue:"字符串值"
它就是这么简单,也有你想要的那么复杂。您可以查看源代码、查看帮助或下载二进制文件。
我强烈建议使用NDesk。选项(文档)和/或Mono。选项(相同的API,不同的名称空间)。文档中的一个例子:
bool show_help = false;
List<string> names = new List<string> ();
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<string> 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;
}
c# CLI是我编写的一个非常简单的命令行参数解析库。它是有据可查的开源软件。
请使用apache commons cli API的。net端口。这很有效。
http://sourceforge.net/projects/dotnetcli/
以及用于概念和介绍的原始API
http://commons.apache.org/cli/
看起来每个人都有自己的宠物命令行解析器,我最好也添加我的:)。
http://bizark.codeplex.com/
这个库包含一个命令行解析器,它将使用命令行中的值初始化一个类。它有很多功能(我已经建立了很多年了)。
从文档中…
怪诞框架中的命令行解析具有以下关键特性:
Automatic initialization: Class properties are automatically set based on the command-line arguments. Default properties: Send in a value without specifying the property name. Value conversion: Uses the powerful ConvertEx class also included in BizArk to convert values to the proper type. Boolean flags: Flags can be specified by simply using the argument (ex, /b for true and /b- for false) or by adding the value true/false, yes/no, etc. Argument arrays: Simply add multiple values after the command-line name to set a property that is defined as an array. Ex, /x 1 2 3 will populate x with the array { 1, 2, 3 } (assuming x is defined as an array of integers). Command-line aliases: A property can support multiple command-line aliases for it. For example, Help uses the alias ?. Partial name recognition: You don’t need to spell out the full name or alias, just spell enough for the parser to disambiguate the property/alias from the others. Supports ClickOnce: Can initialize properties even when they are specified as the query string in a URL for ClickOnce deployed applications. The command-line initialization method will detect if it is running as ClickOnce or not so your code doesn’t need to change when using it. Automatically creates /? help: This includes nice formatting that takes into account the width of the console. Load/Save command-line arguments to a file: This is especially useful if you have multiple large, complex sets of command-line arguments that you want to run multiple times.