C#命令行参数解析库System.CommandLine使用
命令行参数
平常在日常的开发过程中,会经常用到命令行工具。如cmd下的各种命令。
以下为sc命令执行后的截图,可以看到,由于没有输入任何附带参数,所以程序并未执行任何操作,只是输出了描述和用法。
系统在创建一个新进程时,会传一个命令行给它,也就是命令行字符串。
程序需要对命令行字符串进行解析,并执行相应操作。
如使用sc query可以查询当前系统的服务:
在c#中的控制台程序中,main函数中传入的args字符串数组,就是系统传入进程的命令行参数。
在构建具有复杂命令行参数的控制台程序时 ,手动解析参数就变得非常麻烦。这里推荐一个开源的库,可以更加方便的解析命令行参数。
system.commandline介绍
system.commandline是一个基于.net standard 2.0(支持.net framework 4.6.1.2+和.net core 2.0+)的命令行参数解析库,项目地址https://github.com/dotnet/command-line-api,目前,该项目还是属于beta状态,期待以后的正式版本。
由于不是正式版本,在nuget中引用时,需要钩上include prerelease,才能找到这个包。
system.commandline的一些基本概念
token(标记)
命令行的每个单词都是一个标记,如下面的"sc"、"query"和"eventlog"都是一个token
commands(命令)
commands就是应用程序根据token执行相应的操作(在system.commandline库中,对应 command类)
root command(根命令)
根命令是代表可执行程序本身的commands,如 sc(在system.commandline库中,对应rootcommand类)
subcommands(子命令)
一些命令行程序会有subcommands,如上面的sc query中的query就是子命令(在system.commandline,对应command类)
options(可选项)
options就是传递给commands的命名参数,如 app -myoption123中的 -myoption 123就是一个options
argument(参数)
参数就是传递给选项或命令的值。
说明:
常规的调用如下:
xx.exe [options] <argument> [command]
delimiters(分隔符)
分隔符就是把options的命令和值分开的符号
如下三种写法都是一样的,可以使用空格、=或 :符号
app -myoption 123
app -myoption=123
app -myoption:123
aliases(别名)
可以为命令或选项设置较短的别名,如
-v, --verbose
--o, --option
system.commandline使用
在下面的示例中,我们会构建一个简单的控制台爬虫工具。
1、使用visual studio 2019创建一个.net core控制台程序crawler-line
2、导入system.commandline包
3、创建一个rootcommand
var rootcommand = new rootcommand { new argument<string>( "url","web site url"), new option<bool>(new string[]{ "--gethtml" ,"-html"},"get html source"), new option<bool>(new string[]{ "--getimage" ,"-image"},"get images"), new option<bool>(new string[]{ "--regex-option" ,"-regex"},"use regex"), new option<bool>(new string[]{ "--htmlagilitypack-option", "-agpack"},"use htmlagilitypack"), new option<bool>(new string[]{ "--anglesharp-option", "-agsharp"},"use anglesharp"), new option<string>(new string[]{ "--download-path" ,"-path"},"designate download path"),13 };
说明:
可通过option类的构造函数重载,为option指定默认值。
public option(string alias, func<t> getdefaultvalue, string? description = null);
如上面的-path option,指定默认值为d:\download,如下:
new option<string>(new string[]{ "--download-path" ,"-path"},getdefaultvalue:()=>"d:\\download","designate download path"),
也可以先实例化rootcommand对象,再通过add的方式添加argument和option,如下:
var rootcommand = new rootcommand(); //添加 argument rootcommand.addargument(new argument<string>("url","web site url")); //添加 option rootcommand.addoption(new option<string>(new string[] {"--download-path","-path" },"download path"));
4、添加当前命令行程序的描述信息
rootcommand.description = ".net core command-line crawler.";
5、解析argument和option
rootcommand.handler = commandhandler.create<string, bool, bool, bool, bool, bool, string>((string url, bool html, bool image, bool regex, bool agpack, bool agsharp, string path) => { });
如果觉得参数太长,可以封装成类,再进行调用,如下:
public class crawleroption { public string url { get; set; } public bool gethtml { get; set; } public bool getimage { get; set; } public bool regexoption { get; set; } public bool htmlagilitypackoption { get; set; } public bool anglesharpoption { get; set; } public string downloadpath { get; set; } }
rootcommand.handler = commandhandler.create<crawleroption>((crawleroption) => { })
6、添加command并为command添加处理函数
//添加 command var githubcommand = new command("github", "fork me on github"); //添加 command的处理函数 githubcommand.handler = commandhandler.create(() => { system.diagnostics.process.start(new system.diagnostics.processstartinfo("cmd", $"/c start https://github.com/zhaotianff/crawler-line")); }); //将command添加 到rootcommand rootcommand.addcommand(githubcommand);
说明:
1、rootcommand是*命令,rootcommand可以添加command,command又可以再添加subcommand。如此可以无限循环,没有限制 。但建议还是不要添加太多级的command,调用的时候会不太友好
2、command和rootcommand原理一样,如果需要为command添加argument、option和command,可以参照前面的示例
7、调用解析
return rootcommand.invokeasync(args).result;
8、调用示例
#执行github command crawler-line.exe github #执行github subcommand crawler-line.exe github sub #执行argument option crawler-line.exe http://www.baidu.com -path "d:\test"
特别提示:
前面示例中,都是为rootcommand添加的argument和option,如果又指定 -path(option),又执行github(command)肯定会失败。因为github这个命令是rootcommand的子命令,而-path选项是为rootcommand添加的
示例代码
https://github.com/zhaotianff/crawler-line/tree/v1.0
以上就是c#命令行参数解析库system.commandline介绍的详细内容,更多关于c#命令行参数解析库system.commandline的资料请关注其它相关文章!
上一篇: JVM知识总结之垃圾收集算法
下一篇: 支付宝加入长辈模式:字体变大、功能简化