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

参数实体:

 public class CommandLineArgument
{
List<CommandLineArgument> _arguments; int _index; string _argumentText; public CommandLineArgument Next
{
get {
if (_index < _arguments.Count - ) {
return _arguments[_index + ];
} return null;
}
}
public CommandLineArgument Previous
{
get {
if (_index > )
{
return _arguments[_index - ];
} return null;
}
}
internal CommandLineArgument(List<CommandLineArgument> args, int index, string argument)
{
_arguments = args;
_index = index;
_argumentText = argument;
} public CommandLineArgument Take() {
return Next;
} public IEnumerable<CommandLineArgument> Take(int count)
{
var list = new List<CommandLineArgument>();
var parent = this;
for (int i = ; i < count; i++)
{
var next = parent.Next;
if (next == null)
break; list.Add(next); parent = next;
} return list;
} public static implicit operator string(CommandLineArgument argument)
{
return argument._argumentText;
} public override string ToString()
{
return _argumentText;
}
}

参数解析器:

 public class CommandLineArgumentParser
{ List<CommandLineArgument> _arguments;
public static CommandLineArgumentParser Parse(string[] args) {
return new CommandLineArgumentParser(args);
} public CommandLineArgumentParser(string[] args)
{
_arguments = new List<CommandLineArgument>(); for (int i = ; i < args.Length; i++)
{
_arguments.Add(new CommandLineArgument(_arguments,i,args[i]));
} } public CommandLineArgument Get(string argumentName)
{
return _arguments.FirstOrDefault(p => p == argumentName);
} public bool Has(string argumentName) {
return _arguments.Count(p=>p==argumentName)>;
}
}

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

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

Example.exe -u MrJson -p admin123

在Example的Main函数里处理args:

 static void Main(string[] args)
{
var arguments = CommandLineArgumentParser.Parse(args); if (arguments.Has("-u"))
{
Console.WriteLine("用户名:{0}", arguments.Get("-u").Next);
} if (arguments.Has("-p"))
{
Console.WriteLine("密码:{0}", arguments.Get("-p").Next);
}
}

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

Example.exe -chpwd admin888 admin999

那么,就可以这样处理:

 if(arguments.Has("-chpwd"))
{
var arg = arguments.Get("-chpwd");
var oldPwd = arg.Take();
var newPwd = arg.Take().Take();
// 或者
var pwds = arg.Take();
oldPwd = pwds.First();
newPwd = pwds.Last(); Console.WriteLine("原密码:{0} 新密码:{1}", oldPwd, newPwd);
}

That's all.

写个C#命令行参数解析的小工具的更多相关文章

  1. python命令行参数解析模块argparse和docopt

    http://blog.csdn.net/pipisorry/article/details/53046471 还有其他两个模块实现这一功能,getopt(等同于C语言中的getopt())和弃用的o ...

  2. golang-flag - 命令行参数解析

    flag - 命令行参数解析 在写命令行程序(工具.server)时,对命令参数进行解析是常见的需求.各种语言一般都会提供解析命令行参数的方法或库,以方便程序员使用.如果命令行参数纯粹自己写代码解析, ...

  3. Python 中命令行参数解析工具 docopt 安装和应用

    什么是 docopt? 1.docopt 是一种 Python 编写的命令行执行脚本的交互语言. 它是一种语言! 它是一种语言! 它是一种语言! 2.使用这种语言可以在自己的脚本中,添加一些规则限制. ...

  4. gflags命令行参数解析

    gflags库是google开源的命令行参数解析工具. 安装 官方没有提供二进制库,但是Debian/Ubuntu平台本身提供了二进制库,可以直接git clone https://github.co ...

  5. [Go] 命令行参数解析包(flag 包)使用详解

    Go 的 flag 包可以解析命令行的参数. 一.命令行语法 命令行语法主要有以下几种形式: cmd -flag       // 只支持bool类型 cmd -flag=xxx cmd -flag ...

  6. $命令行参数解析模块argparse的用法

    argparse是python内置的命令行参数解析模块,可以用来为程序配置功能丰富的命令行参数,方便使用,本文总结一下其基本用法. 测试脚本 把以下脚本存在argtest.py文件中: # codin ...

  7. Google开源命令行参数解析库gflags

    Google开源命令行参数解析库gflags http://blog.csdn.net/lming_08/article/details/25072899 CMDLINE的解析 http://blog ...

  8. PHP 命令行参数解析工具类

    <?php/** * 命令行参数解析工具类 * @author guolinchao * @email luoyecb@163.com */class CommandLine{ // store ...

  9. Python命令行参数解析模块getopt使用实例

    Python命令行参数解析模块getopt使用实例 这篇文章主要介绍了Python命令行参数解析模块getopt使用实例,本文讲解了使用语法格式.短选项参数实例.长选项参数实例等内容,需要的朋友可以参 ...

随机推荐

  1. js测试题

    (function(){ return typeof arguments;})();"object" var f = function g(){ return 23; };type ...

  2. Hadoop学习笔记—6.Hadoop Eclipse插件的使用

    开篇:Hadoop是一个强大的并行软件开发框架,它可以让任务在分布式集群上并行处理,从而提高执行效率.但是,它也有一些缺点,如编码.调试Hadoop程序的难度较大,这样的缺点直接导致开发人员入门门槛高 ...

  3. 新开了一个ABP交流的QQ群(579765441 ),欢迎加入

    因为ABP架构设计交流群人数一直爆满,很多想交流ABP的朋友无法加进群里, 刚新建了一个QQ群,群号579765441 (ABP架构设计交流群2),欢迎对ABP感兴趣的朋友加入. 欢迎加QQ群: AB ...

  4. C#中,使用正式表达式匹配获取所需数据

    .NET中,使用正式表达式匹配获取所需数据 需求:获取一串字符串中,正则匹配出需要的数据. 例如以下字符串: string temp ="ErrorCode:-1,Message:{&quo ...

  5. LInux 查看环境变量

    1. 显示环境变量HOME $ echo $HOME /home/redbooks 2. 设置一个新的环境变量hello $ export HELLO="Hello!" $ ech ...

  6. chrome使用技巧(看了定不让你失望)

    写在前面 之前有看过刘哇勇写的Chrome 控制台不完全指南,让我觉得瞬间对chrome的了解实在太浅了.对此特意了解了一番(也就是在他的博文上进行了一些总结和了解一些其它chrome使用方面的诀窍) ...

  7. fir.im Weekly - 暖心的 iOS 持续集成,你值得拥有

    一则利好消息,flow.ci 支持 iOS 项目持续集成,想试试的伙伴去 Gitter群 问问.首批尝鲜用户@阿米amoy 已经用 flow.ci 实现了基本的 iOS 持续集成,并详细记录整个 Bu ...

  8. 基于ReactCSSTransitionGroup实现react-router过渡动画

      此前,我使用了react-router库来完成单页应用的路由,从而实现组件之间的切换能力.然而,默认页面的切换是非常生硬的,为了让页面切换更加缓和与舒适,通常的方案就是过渡动画. 这里我调研了2种 ...

  9. MongoDB replica set IDs do not match

    在搭建MongoDB(版本 3.2.9)的Replica Set时,使用 rs.status() 查看Replica Set的状态,发现一个成员异常:replica set IDs do not ma ...

  10. 这台计算机上缺少此项目引用的 NuGet 程序包-缺少的文件是 ..\packages\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.1.0.0\build\Microsoft.CodeDom.Providers.DotNetCompilerPlatform.props

    异常处理汇总-开发工具  http://www.cnblogs.com/dunitian/p/4522988.html 协助开发里面总有几个是极简爱好者,但是呢删了不该删的就会影响项目开发,下面看下完 ...