title author date CreateTime categories
C#命令行解析工具
lindexi
2019-09-02 12:57:37 +0800
2018-2-13 17:23:3 +0800
C#

我将告诉大家两个方法去获取C#输入的命令行参数。

第一个方法是不需要安装任何的库,这个方法是性能很高,但是封装不好。第二个方法是使用 CommandLineParser 库,这个库提高很好的封装但是性能会比较差。

第一个方法:

林选臣大神写的,他的方法很简单。

首先复制两个类到项目

      public class CommandLineArgumentParser
{
private readonly List<CommandLineArgument> _arguments; public CommandLineArgumentParser(string[] args)
{
_arguments = new List<CommandLineArgument>(); for (var i = 0; i < args.Length; i++)
{
_arguments.Add(new CommandLineArgument(_arguments, i, args[i]));
}
} public static CommandLineArgumentParser Parse(string[] args)
{
return new CommandLineArgumentParser(args);
} public CommandLineArgument Get(string argumentName)
{
return _arguments.FirstOrDefault(p => p == argumentName);
} public IEnumerable<CommandLineArgument> GetEnumerator()
{
foreach (var temp in _arguments)
{
yield return temp;
}
} public bool Has(string argumentName)
{
return _arguments.Count(p => p == argumentName) > 0;
}
} public class CommandLineArgument
{
private readonly List<CommandLineArgument> _arguments; private readonly string _argumentText; private readonly int _index; internal CommandLineArgument(List<CommandLineArgument> args, int index, string argument)
{
_arguments = args;
_index = index;
_argumentText = argument;
} public CommandLineArgument Next
{
get
{
if (_index < _arguments.Count - 1)
{
return _arguments[_index + 1];
} return null;
}
} public CommandLineArgument Previous
{
get
{
if (_index > 0)
{
return _arguments[_index - 1];
} return null;
}
} public CommandLineArgument Take()
{
return Next;
} public IEnumerable<CommandLineArgument> Take(int count)
{
var list = new List<CommandLineArgument>();
var parent = this;
for (var i = 0; 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;
}
}

复制完成就可以使用,在主函数可以使用下面代码进行转换,下面代码的 args 就是传入的参数字符串数组。

    var arguments = CommandLineArgumentParser.Parse(args);

如果需要获得参数的信息,可以使用下面代码,也就是使用 Get 方法传入一个指定的值,通过这个值就可以拿到这个值的参数

var f = arguments.Get("--lindexi").Take();

如命令输入--lindexi doubi,上面代码就可以拿到doubi,虽然使用这个库的写法的封装不是很好,但是性能很好。下面告诉大家使用另一个方法,十分容易写,但是性能比较差。

第二个方法需要使用 Nuget 安装 CommandLineParser 库,可以在控制台输入下面代码安装

  Install-Package CommandLineParser

然后写一个工具类,代码是在申龙斌大神博客 抄的

   class Options
{ // 短参数名称,长参数名称,是否是可选参数,默认值,帮助文本等 // 第一个参数-d 如果使用比较高的 .net 那么第一个参数可能是 char 而不是字符串 [Option("d", "dir", Required = true, HelpText = "PGN Directory to read.")]
public string PgnDir { get; set; } // 新的版本使用的是 char 来作为第一个字符,也就是需要修改 "d" 为 'd' 字符
// [Option('d', "dir", Required = true, HelpText = "PGN Directory to read.")]
// public string PgnDir { get; set; } // 第二个参数-s 也可以使用 --step [Option("s", "step", DefaultValue = 30, HelpText = "The maximum steps in PGN game to process.")]
public int MaxStep { get; set; } [HelpOption]
public string GetUsage()
{ // 应该可以根据前面的参数设置自动生成使用说明的,这里没有使用 var usage = new StringBuilder(); usage.AppendLine("OpeningBook 1.0"); usage.AppendLine("-d PgnDir [-s MaxSteps=30]"); return usage.ToString();
}
}

主程序Main里使用可以使用下面代码,这里的 args 数组就是主函数传入函数。下面的代码是老版本的写法

// 老版本的写法

var options = new Options();

if (Parser.Default.ParseArguments(args, options))
{ string pgnDir = options.PgnDir; int maxStep = options.MaxStep; // 参数取出来了,可以随便使用了 // 本例中参数比较简单,稍微有点大材小用了 }
else
{
//转化失败 Console.WriteLine(options.GetUsage()); }

上面的代码是老的版本,现在更新 2.2.0 版本是需要修改代码

    class Options
{
// 注意 'd' 用的是字符
// 短参数名称,长参数名称,是否是可选参数,默认值,帮助文本等 [Option('d', "dir", Required = true, HelpText = "PGN Directory to read.")]
public string PgnDir { get; set; } // 第二个参数-s [Option('s', "step", HelpText = "The maximum steps in PGN game to process.")]
public int MaxStep { get; set; }
}

原来的 DefaultValue 修改为 Default 可以传入任何类型

在 Main 函数需要修改代码

            CommandLine.Parser.Default.ParseArguments<Options>(args)
.WithParsed(options =>
{
var step = options.MaxStep;
})
.WithNotParsed(errorList =>
{ });

在 WithParsed 就是解析成功的委托,在 WithNotParsed 就是解析失败的

如何使用参见:http://www.cnblogs.com/speeding/archive/2012/08/07/2626066.html

Quickstart · gsscoder/commandline Wiki

参见:http://www.cnblogs.com/linxuanchen/p/c-sharp-command-line-argument-parser.html

http://www.cnblogs.com/speeding/archive/2012/08/07/2626066.html

安利一款命令行参数

2019-9-2-C#命令行解析工具的更多相关文章

  1. Python 命令行解析工具 Argparse介绍

    最近在研究pathon的命令行解析工具,argparse,它是Python标准库中推荐使用的编写命令行程序的工具. 以前老是做UI程序,今天试了下命令行程序,感觉相当好,不用再花大把时间去研究界面问题 ...

  2. python之命令行解析工具argparse

    以前写python的时候都会自己在文件开头写一个usgae函数,用来加上各种注释,给用这个脚本的人提供帮助文档. 今天才知道原来python已经有一个自带的命令行解析工具argparse,用了一下,效 ...

  3. python命令行解析工具argparse模块【1】

    argpaser是python中很好用的一个命令行解析模块,使用它我们可以很方便的创建用户友好型命令行程序.而且argparse会自动生成帮助信息和错误信息. 一.示例 例如下面的例子,从命令行中获取 ...

  4. Python中最好用的命令行解析工具:argparse

    Python 做为一个脚本语言,可以很方便地写各种工具.当你在服务端要运行一个工具或服务时,输入参数似乎是一种硬需(当然你也可以通过配置文件来实现). 如果要以命令行执行,那你需要解析一个命令行参数解 ...

  5. python命令行解析工具argparse模块【3】

    上一节,我们讲解了ArgumentParser对象,这一节我们将学习这个对象的add_argument()方法.         add_argument()方法的定义了如何解析一个命令行参数,每个参 ...

  6. python命令行解析工具argparse模块【5】

            上一节我们学习了parse_args()的用法,这一节,我们将继续学习argparse的其他一些用法.         1.sub-commands子命令         argpar ...

  7. python命令行解析工具argparse模块【4】

            上一节我们讲解了add_argument()方法,这一节我们将学习parse_args()方法.          parse_args()方法的作用是解析命令行参数,并返回解析之后的 ...

  8. python命令行解析工具argparse模块【2】

    上一节,我们简要的介绍了argparse的用法,接下来几节,将详细讲解其中的参数及用法,这一节我们讲解ArgumentParser对象. argparse.ArgumentParser([descri ...

  9. C#命令行解析工具

    我将告诉大家两个方法去获取C#输入的命令行参数. 第一个方法: 林选臣大神写的,他的方法很简单. 首先复制两个类到项目 public class CommandLineArgumentParser { ...

随机推荐

  1. img标签src不给路径就会出现边框

    <img/>在src加载失败或没有给的,浏览器会自动给img加上边框. 如下图这样: 产品觉得影响美观,一定要pass掉. 原码是这样: .ctn{ position: relative; ...

  2. 【转载】【python】python练手项目

    入门篇 1.Python - Python 图片转字符画 50 行 Python 代码完成图片转字符画小工具. &lt;img src="https://pic3.zhimg.com ...

  3. SpringBoot 异步 定时任务 邮件

    springboot异步 一: 在 MyConfiguration.java 中开启注解 @Configuration//指明当前类是一个配置类:就是来替代之前的Spring配置文件@EnableAs ...

  4. bzoj4033 树上染色

    Description 有一棵点数为N的树,树边有边权.给你一个在0~N之内的正整数K,你要在这棵树中选择K个点,将其染成黑色,并 将其他的N-K个点染成白色.将所有点染色后,你会获得黑点两两之间的距 ...

  5. shell学习(16)- 压缩和解压缩命令tar和zip

    tar命令 [root@Linux ~]# tar [-cxtzjvfpPN] 文件与目录 .... 参数: -c :建立一个压缩文件的参数指令(create 的意思): -x :解开一个压缩文件的参 ...

  6. Vue知识点——vue数据深拷贝方法

    背景 在vue页面传递数据的过程中,传递数据的引用地址并不会改变,所以当我们改变一些数据时,数据源 也会随之改变.可是有很多情景,我们改变传递的数据,并不需要源数据值发生变化,这时我们就需要对数据进行 ...

  7. React 从零搭建项目 使用 create-react-app脚手架

    一.安装 npm install -g create-react-app 版本校验:create-react-app --version 二.创建项目 create-react-app指令默认调用np ...

  8. day10-04_多线程常用属性方法

    一.需要了解的方法 Thread实例对象的方法 # isAlive(): 判断这个线程是否是存活的 # getName(): 获取线程名 # setName(): 设置线程名 #enumerate() ...

  9. WPF Canvas实现进度条

    原文:WPF Canvas实现进度条 先看效果图: 思路: 一个Canvas做背景,一个Canvas用来显示进度,图片放在显示进度的Canvas中,靠右设置为图片本身宽度一半的距离,视觉上实现以图片中 ...

  10. oracle函数 TO_MULTI_BYTE(c1)

    [功能]将字符串中的半角转化为全角 [参数]c1,字符型 [返回]字符串 [示例] SQL> select to_multi_byte('高A') text from dual; test -- ...