• 写个C#命令行参数解析的小工具


    最近测试工作做的比较多因此时常要创建一些控制台类型的应用程序。因为程序有不同的参数开关,需要在程序启动的时候通过命令行来给程序传递各种开关和参数。直接操作args有些不方便,所以就写了个解析参数的小工具来处理各种参数。

    参数实体:

     1 public class CommandLineArgument
     2 {
     3     List<CommandLineArgument> _arguments;
     4 
     5     int _index;
     6 
     7     string _argumentText;
     8 
     9     public CommandLineArgument Next
    10     {
    11         get {
    12             if (_index < _arguments.Count - 1) {
    13                 return _arguments[_index + 1];
    14             }
    15 
    16             return null;
    17         }
    18     }
    19     public CommandLineArgument Previous
    20     {
    21         get {
    22             if (_index > 0)
    23             {
    24                 return _arguments[_index - 1];
    25             }
    26 
    27             return null;
    28         }
    29     }
    30     internal CommandLineArgument(List<CommandLineArgument> args, int index, string argument)
    31     {
    32         _arguments = args;
    33         _index = index;
    34         _argumentText = argument;
    35     }
    36 
    37     public CommandLineArgument Take() {
    38         return Next;
    39     }
    40 
    41     public IEnumerable<CommandLineArgument> Take(int count)
    42     {
    43         var list = new List<CommandLineArgument>();
    44         var parent = this;
    45         for (int i = 0; i < count; i++)
    46         {
    47             var next = parent.Next;
    48             if (next == null)
    49                 break;
    50 
    51             list.Add(next);
    52 
    53             parent = next;
    54         }
    55 
    56         return list;
    57     }
    58 
    59     public static implicit operator string(CommandLineArgument argument)
    60     {
    61         return argument._argumentText;
    62     }
    63 
    64     public override string ToString()
    65     {
    66         return _argumentText;
    67     }
    68 }

    参数解析器:

     1 public class CommandLineArgumentParser
     2 {
     3 
     4     List<CommandLineArgument> _arguments;
     5     public static CommandLineArgumentParser Parse(string[] args) {
     6         return new CommandLineArgumentParser(args);
     7     }
     8 
     9     public CommandLineArgumentParser(string[] args)
    10     {
    11         _arguments = new List<CommandLineArgument>();
    12 
    13         for (int i = 0; i < args.Length; i++)
    14         {
    15             _arguments.Add(new CommandLineArgument(_arguments,i,args[i]));
    16         }
    17 
    18     }
    19 
    20     public CommandLineArgument Get(string argumentName)
    21     {
    22         return _arguments.FirstOrDefault(p => p == argumentName);
    23     }
    24 
    25     public bool Has(string argumentName) {
    26         return _arguments.Count(p=>p==argumentName)>0;
    27     }
    28 }

    在项目中引入这两个类就可以在Main函数里对args做相应的解析和操作了。

    例如有控制台应用Example,在命令行中输入:

    Example.exe -u MrJson -p admin123

    在Example的Main函数里处理args:

     1 static void Main(string[] args)
     2 {
     3     var arguments = CommandLineArgumentParser.Parse(args);
     4 
     5     if (arguments.Has("-u"))
     6     {
     7         Console.WriteLine("用户名:{0}", arguments.Get("-u").Next);
     8     }
     9 
    10     if (arguments.Has("-p"))
    11     {
    12         Console.WriteLine("密码:{0}", arguments.Get("-p").Next);
    13     }
    14 }

    如果参数后面要传多个值,例如下面这个例子,-chpwd参数需要两个参数:

    Example.exe -chpwd admin888 admin999

    那么,就可以这样处理:

     1 if(arguments.Has("-chpwd"))
     2 {
     3     var arg = arguments.Get("-chpwd");
     4     var oldPwd = arg.Take();
     5     var newPwd = arg.Take().Take();
     6     // 或者
     7     var pwds = arg.Take(2);
     8     oldPwd = pwds.First();
     9     newPwd = pwds.Last();
    10 
    11     Console.WriteLine("原密码:{0} 新密码:{1}", oldPwd, newPwd);  
    12 }

    That's all.

  • 相关阅读:
    python_获得列表中重复的项的索引
    sql的一些知识_高级
    464. Can I Win
    rankable cache class
    two sum class
    Generate a binary tree from parent->child relationship
    An implementation of this using bufferedReader:
    implement list use arrary
    12. Integer to Roman
    Partition of a set into K subsets with equal sum
  • 原文地址:https://www.cnblogs.com/linxuanchen/p/c-sharp-command-line-argument-parser.html
Copyright © 2020-2023  润新知