当前位置:网站首页>C#命令行解析工具
C#命令行解析工具
2022-08-04 15:37:00 【林德熙】
我将告诉大家两个方法去获取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.Any(temp => temp == argumentName);
}
}
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
边栏推荐
- ITSM软件与工单系统的区别是什么?
- 动态数组底层是如何实现的
- Taurus.MVC WebAPI 入门开发教程2:添加控制器输出Hello World。
- 吴恩达机器学习[12]-机器学习系统设计
- C端折戟,转战B端,联想的元宇宙梦能成吗?
- Summary of some pytorch knowledge points that have been updated for a long time
- 成功 解决 @keyup.enter=“search()“ 在el-input 组件中不生效的问题
- To ensure that the communication mechanism
- 第三章 Scala运算符
- 《电磁兼容防护EMC》学习笔记
猜你喜欢
【伸手党福利】投影仪初学者入门——投影亮度及幕布选择——从入门到精通
成功 解决 @keyup.enter=“search()“ 在el-input 组件中不生效的问题
图解 SQL,这也太形象了吧!
Byte、Short、Integer、Long内部缓存类的对比与源码分析
普法教育结合VR全景,直观感受和学习法治精神
2022 Hangzhou Electric Multi-School 4
What are the useful IT asset management platforms?
What is the difference between ITSM software and a work order system?
性能提升400倍丨外汇掉期估值计算优化案例
吴恩达机器学习[9]-神经网络学习
随机推荐
Projector reached the party benefits 】 【 beginners entry - brightness projection and curtain selection - from entry to the master
为什么Redis默认序列化器处理之后的key会带有乱码?
使用百度EasyDL实现森林火灾预警识别
JVM调优-GC基本原理和调优关键分析
What are the useful IT asset management platforms?
365天挑战LeetCode1000题——Day 049 非递增顺序的最小子序列 贪心
The electromagnetic compatibility EMC protection study notes
Sublime Text 好用的插件
初学爬虫笔记(收集数据)
农产品期货开户哪家好??
In action: 10 ways to implement delayed tasks, with code!
Go Go 简单的很,标准库之 fmt 包的一键入门
SublimeText 粘贴图片保存到本地
卖家寄卖流程梳理
长期更新的一些 pytorch 知识点总结
《2022 年上半年全球独角兽企业发展研究报告》发布——DEMO WORLD世界创新峰会圆满落幕
Redis-主从复制
无心剑七绝《七夕牵手》
Redis-哨兵模式
FTP协议抓包-工具wireshark与filezilla