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

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

最近测试工作做的比较多因此时常要创建一些控制台类型的应用程序。因为程序有不同的参数开关,需要在程序启动的时候通过命令行来给程序传递各种开关和参数。直接操作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.

免责声明:文章转载自《写个C#命令行参数解析的小工具》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【转】使用 Android 的日志工具LogCat【Android开发坑系列】之PopupWindow下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

wpf mvvm模式下 在ViewModel关闭view

本文只是博主用来记录笔记,误喷 使用到到了MVVM中消息通知功能 第一步:在需要关闭窗体中注册消息   1 public UserView() 2 { 3 this.DataContext = new UserViewModel(); 4 InitializeComponent();...

【SpringBoot WEB 系列】SSE 服务器发送事件详解

【SpringBoot WEB系列】SSE 服务器发送事件详解 SSE 全称Server Sent Event,直译一下就是服务器发送事件,一般的项目开发中,用到的机会不多,可能很多小伙伴不太清楚这个东西,到底是干啥的,有啥用 本文主要知识点如下: SSE 扫盲,应用场景分析 借助异步请求实现 sse 功能,加深概念理解 使用SseEmitter实现一...

转载:Android应用的自动更新模块

软件的自动更新一般都与Splash界面绑定在一起, 由于需要维护的软件界面很复杂, 一个Activity中嵌入ViewPager, 并且逻辑比较复杂, 索性重新写一个Activity, 现在的软件都很流行使用Splash界面, 正好与自动更新配套在一起; 在这个自动更新Splash中, 使用到了 动画设置 ,SharedPerference ,pull解析...

C#完整的通信代码(点对点,点对多,同步,异步,UDP,TCP)

原文引自:http://www.cnblogs.com/DebugLZQ/archive/2011/08/09/2132423.htmlC# code namespace UDPServer { class Program { static void Main(string[] args) { int recv; byte[] data = new byt...

封装hiredis——C++与redis对接(一)(string的SET与GET操作)

  在菜鸟教程自学了redis,总想着像Mysql一样,在C/C++中进行对接。于是查询了一些资料,最后找到了hiredis。然而直接用它的话,难免有点不方便。于是,对其进行封装。   hiredis直接去git上克隆,地址:https://github.com/redis/hiredis。   下载好之后,由于其自带Makefile,只要make一下就编...

Jackson 框架JSON、XML、List、Map直接相互转换

博客分类:   json   参考:http://www.cnblogs.com/hoojo/archive/2011/04/22/2024628.html 在其基础上做了稍微调整 详情见附件 jackson API文档:http://tool.oschina.net/apidocs/apidoc?api=jackson-1.9.9 Jacks...