关于.net 3.5:在C#中解析命令行选项

Parsing command-line options in C#

本问题已经有最佳答案,请猛点这里访问。

我见过有人编写自定义类来更容易地处理各种语言的命令行选项。我想知道.NET(3.5或更低版本)是否内置了任何内容,这样您就不必自定义分析以下内容:

myapp.exe file=text.txt


这是另一种可能的方法。很简单,但过去对我很有用。

1
2
3
4
5
6
string[] args = {"/a:b","/c:","/d"};
Dictionary<string, string> retval = args.ToDictionary(
     k => k.Split(new char[] { ':' }, 2)[0].ToLower(),
     v => v.Split(new char[] { ':' }, 2).Count() > 1
                                        ? v.Split(new char[] { ':' }, 2)[1]
                                        : null);

对于不需要任何复杂功能的快速和肮脏实用程序,控制台应用程序经常采用以下形式的命令行:

1
program.exe command -option1 optionparameter option2 optionparameter

等。

如果是这样的话,要得到"命令",只需使用args[0]

要获得选项,请使用如下内容:

1
var outputFile = GetArgument(args,"-o");

其中,GetArgument定义为:

1
2
string GetArgument(IEnumerable<string> args, string option)
    => args.SkipWhile(i => i != option).Skip(1).Take(1).FirstOrDefault();


如果您不喜欢使用库,并且简单的东西足够好,您可以这样做:

1
2
3
4
5
string[] args = Environment.GetCommandLineArgs().Skip(1).ToArray();
Func<string, string> lookupFunc =
    option => args.Where(s => s.StartsWith(option)).Select(s => s.Substring(option.Length)).FirstOrDefault();

string myOption = lookupFunc("myOption=");


这是一篇相当古老的文章,但这里是我在所有控制台应用程序中设计和使用的。它只是一小段代码,可以注入到一个文件中,一切都会正常工作。

http://www.ananthonline.net/blog/dotnet/parsing-command-line-arguments-with-c-linq

编辑:这现在在nuget上可用,并且是开源项目代码块的一部分。

它被设计成以声明和直观的方式使用,就像这样(这里的另一个用法示例):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
args.Process(
    // Usage here, called when no switches are found
    () => Console.WriteLine("Usage is switch0:value switch:value switch2"),

    // Declare switches and handlers here
    // handlers can access fields from the enclosing class, so they can set up
    // any state they need.
    new CommandLine.Switch(
       "switch0",
        val => Console.WriteLine("switch 0 with value {0}", string.Join("", val))),
    new CommandLine.Switch(
       "switch1",
        val => Console.WriteLine("switch 1 with value {0}", string.Join("", val)),"s1"),
    new CommandLine.Switch(
       "switch2",
        val => Console.WriteLine("switch 2 with value {0}", string.Join("", val))));

编辑:没有。

但是有一些解析器是人们建造的,比如…

可以说是最好的:C命令行参数分析器