• 写个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.

  • 相关阅读:
    多线程中,上锁的理解
    sql server 2008 联机丛书
    序列化是线程安全的么
    对象化下的编程——字段
    Dic实现工厂模式
    design principle:java 回调与委派/委托机制(转)
    风筝数据结构学习笔记(2)后序遍历二叉树(非递归)
    风筝数据结构学习笔记(1)利用链式存储结构和递归构建二叉树
    吕震宇老师《设计模式系列》
    吕震宇老师《设计模式随笔系列》
  • 原文地址:https://www.cnblogs.com/linxuanchen/p/c-sharp-command-line-argument-parser.html
Copyright © 2020-2023  润新知