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

 

posted @   林选臣  阅读(9206)  评论(3编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示