服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#命令行参数解析库System.CommandLine使用

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

2022-11-21 15:00zhaotianff C#

System.CommandLine是一个基于.Net Standard 2.0的命令行参数解析库,该项目还是属于beta状态,期待以后的正式版本,文章通过示例代码给大家介绍了System.CommandLine使用讲解,感兴趣的朋友一起看看吧

命令行参数

平常在日常的开发过程中,会经常用到命令行工具。如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的资料请关注服务器之家其它相关文章!

原文链接:https://www.cnblogs.com/zhaotianff/p/13507665.html

延伸 · 阅读

精彩推荐
  • C#C#隐式/显示实现接口方法详解

    C#隐式/显示实现接口方法详解

    这篇文章主要为大家详细介绍了C#隐式/显示实现接口方法,接口的使用场景介绍,感兴趣的小伙伴们可以参考一下...

    我是攻城狮9482021-11-16
  • C#C#调用存储过程详解(带返回值、参数输入输出等)

    C#调用存储过程详解(带返回值、参数输入输出等)

    这篇文章主要介绍了C#调用存储过程的方法,结合实例形式详细分析了各种常用的存储过程调用方法,包括带返回值、参数输入输出等,需要的朋友可以参考下...

    smartsmile20126412021-11-24
  • C#C#基础学习系列之Attribute和反射详解

    C#基础学习系列之Attribute和反射详解

    大家在使用Attribute的时候大多需要用到反射,所以放在一起。下面这篇文章主要给大家介绍了关于C#基础学习系列之Attribute和反射的相关资料,文中给出了...

    Boyd Wang7902022-01-21
  • C#VS2019使用快捷键将代码对齐的方法

    VS2019使用快捷键将代码对齐的方法

    这篇文章主要介绍了VS2019使用快捷键将代码对齐的相关资料,非常不错对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...

    algsup10232022-08-31
  • C#C#做线形图的方法

    C#做线形图的方法

    在本篇内容中小编给大家总结了C#怎么做线形图的教程内容,对此有需要的朋友们可以跟着学习下。...

    C#教程网9242022-03-07
  • C#C# WinForm实现图片浏览器

    C# WinForm实现图片浏览器

    这篇文章主要为大家详细介绍了C# WinForm实现图片浏览器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    片刻清夏5112022-02-20
  • C#C# 中使用正则表达式匹配字符的含义

    C# 中使用正则表达式匹配字符的含义

    正则表达式的作用用来描述字符串的特征。本文重点给大家介绍C# 中使用正则表达式匹配字符的含义,非常不错,具有一定的参考借鉴价值,需要的朋友参...

    在代码的世界里游走7962022-03-03
  • C#C#如何优雅的结束线程

    C#如何优雅的结束线程

    这篇文章主要介绍了C#如何优雅的结束一个线程,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以...

    宏宇6052022-11-17