欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C#命令行参数解析库System.CommandLine使用

程序员文章站 2022-06-23 09:03:49
命令行参数平常在日常的开发过程中,会经常用到命令行工具。如cmd下的各种命令。以下为sc命令执行后的截图,可以看到,由于没有输入任何附带参数,所以程序并未执行任何操作,只是输出了描述和用法。系统在创建...

命令行参数

平常在日常的开发过程中,会经常用到命令行工具。如cmd下的各种命令。

以下为sc命令执行后的截图,可以看到,由于没有输入任何附带参数,所以程序并未执行任何操作,只是输出了描述和用法。

C#命令行参数解析库System.CommandLine使用

系统在创建一个新进程时,会传一个命令行给它,也就是命令行字符串。

程序需要对命令行字符串进行解析,并执行相应操作。

如使用sc query可以查询当前系统的服务:

C#命令行参数解析库System.CommandLine使用

在c#中的控制台程序中,main函数中传入的args字符串数组,就是系统传入进程的命令行参数。

C#命令行参数解析库System.CommandLine使用

在构建具有复杂命令行参数的控制台程序时 ,手动解析参数就变得非常麻烦。这里推荐一个开源的库,可以更加方便的解析命令行参数。

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,才能找到这个包。

C#命令行参数解析库System.CommandLine使用

system.commandline的一些基本概念

token(标记)

命令行的每个单词都是一个标记,如下面的"sc"、"query"和"eventlog"都是一个token

C#命令行参数解析库System.CommandLine使用

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

C#命令行参数解析库System.CommandLine使用

2、导入system.commandline包

C#命令行参数解析库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、添加当前命令行程序的描述信息

C#命令行参数解析库System.CommandLine使用

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的资料请关注其它相关文章!