最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#命令行參數(shù)解析庫(kù)System.CommandLine使用

 更新時(shí)間:2021年06月03日 11:47:14   作者:zhaotianff  
System.CommandLine是一個(gè)基于.Net Standard 2.0的命令行參數(shù)解析庫(kù),該項(xiàng)目還是屬于beta狀態(tài),期待以后的正式版本,文章通過(guò)示例代碼給大家介紹了System.CommandLine使用講解,感興趣的朋友一起看看吧

命令行參數(shù)

平常在日常的開(kāi)發(fā)過(guò)程中,會(huì)經(jīng)常用到命令行工具。如cmd下的各種命令。

以下為sc命令執(zhí)行后的截圖,可以看到,由于沒(méi)有輸入任何附帶參數(shù),所以程序并未執(zhí)行任何操作,只是輸出了描述和用法。

系統(tǒng)在創(chuàng)建一個(gè)新進(jìn)程時(shí),會(huì)傳一個(gè)命令行給它,也就是命令行字符串。

程序需要對(duì)命令行字符串進(jìn)行解析,并執(zhí)行相應(yīng)操作。

如使用sc query可以查詢當(dāng)前系統(tǒng)的服務(wù):

在C#中的控制臺(tái)程序中,Main函數(shù)中傳入的args字符串?dāng)?shù)組,就是系統(tǒng)傳入進(jìn)程的命令行參數(shù)。

在構(gòu)建具有復(fù)雜命令行參數(shù)的控制臺(tái)程序時(shí) ,手動(dòng)解析參數(shù)就變得非常麻煩。這里推薦一個(gè)開(kāi)源的庫(kù),可以更加方便的解析命令行參數(shù)。

System.CommandLine介紹

System.CommandLine是一個(gè)基于.Net Standard 2.0(支持.Net FrameWork 4.6.1.2+和.Net Core 2.0+)的命令行參數(shù)解析庫(kù),項(xiàng)目地址https://github.com/dotnet/command-line-api,目前,該項(xiàng)目還是屬于beta狀態(tài),期待以后的正式版本。

由于不是正式版本,在Nuget中引用時(shí),需要鉤上Include prerelease,才能找到這個(gè)包。

System.CommandLine的一些基本概念

Token(標(biāo)記)

命令行的每個(gè)單詞都是一個(gè)標(biāo)記,如下面的"sc"、"query"和"eventlog"都是一個(gè)Token

Commands(命令)

Commands就是應(yīng)用程序根據(jù)Token執(zhí)行相應(yīng)的操作(在System.CommandLine庫(kù)中,對(duì)應(yīng) Command類)

Root Command(根命令)

根命令是代表可執(zhí)行程序本身的Commands,如 sc(在System.CommandLine庫(kù)中,對(duì)應(yīng)RootCommand類)

SubCommands(子命令)

一些命令行程序會(huì)有SubCommands,如上面的sc query中的query就是子命令(在System.CommandLine,對(duì)應(yīng)Command類)

Options(可選項(xiàng))

Options就是傳遞給Commands的命名參數(shù),如 app -myoption123中的 -myoption 123就是一個(gè)Options

Argument(參數(shù))

參數(shù)就是傳遞給選項(xiàng)或命令的值。

說(shuō)明:

常規(guī)的調(diào)用如下:

xx.exe [options] <argument> [command]

Delimiters(分隔符)

分隔符就是把Options的命令和值分開(kāi)的符號(hào)

如下三種寫法都是一樣的,可以使用空格、=或 :符號(hào)

app -myoption 123

app -myoption=123

app -myoption:123

Aliases(別名)

可以為命令或選項(xiàng)設(shè)置較短的別名,如

-v, --verbose

--o, --option

System.CommandLine使用

在下面的示例中,我們會(huì)構(gòu)建一個(gè)簡(jiǎn)單的控制臺(tái)爬蟲工具。

1、使用Visual Studio 2019創(chuàng)建一個(gè).Net Core控制臺(tái)程序crawler-line

2、導(dǎo)入System.CommandLine包

3、創(chuàng)建一個(gè)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             };

說(shuō)明:

可通過(guò)Option類的構(gòu)造函數(shù)重載,為Option指定默認(rèn)值。

public Option(string alias, Func<T> getDefaultValue, string? description = null);

如上面的-path Option,指定默認(rèn)值為D:\download,如下:

 new Option<string>(new string[]{ "--download-path" ,"-path"},getDefaultValue:()=>"D:\\download","Designate download path"),

也可以先實(shí)例化RootCommand對(duì)象,再通過(guò)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、添加當(dāng)前命令行程序的描述信息

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) => {
                
            });

如果覺(jué)得參數(shù)太長(zhǎng),可以封裝成類,再進(jìn)行調(diào)用,如下:

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添加處理函數(shù)

             //添加 Command
             var githubCommand = new Command("github", "fork me on github");
             //添加 Command的處理函數(shù)
             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);

說(shuō)明:

1、RootCommand是頂級(jí)命令,RootCommand可以添加Command,Command又可以再添加SubCommand。如此可以無(wú)限循環(huán),沒(méi)有限制 。但建議還是不要添加太多級(jí)的Command,調(diào)用的時(shí)候會(huì)不太友好

2、Command和RootCommand原理一樣,如果需要為Command添加Argument、Option和Command,可以參照前面的示例

7、調(diào)用解析

return rootCommand.InvokeAsync(args).Result;

8、調(diào)用示例

#執(zhí)行g(shù)ithub command
crawler-line.exe github
#執(zhí)行g(shù)ithub subcommand
crawler-line.exe github sub
#執(zhí)行argument option
crawler-line.exe http://www.baidu.com -path "D:\test"

特別提示:

前面示例中,都是為RootCommand添加的Argument和Option,如果又指定 -path(Option),又執(zhí)行g(shù)ithub(Command)肯定會(huì)失敗。因?yàn)間ithub這個(gè)命令是RootCommand的子命令,而-path選項(xiàng)是為RootCommand添加的

示例代碼

https://github.com/zhaotianff/Crawler-Line/tree/v1.0

以上就是C#命令行參數(shù)解析庫(kù)System.CommandLine介紹的詳細(xì)內(nèi)容,更多關(guān)于C#命令行參數(shù)解析庫(kù)System.CommandLine的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • c#讀取文件詳談

    c#讀取文件詳談

    你平時(shí)是怎么讀取文件的?使用流讀取。是的沒(méi)錯(cuò),C#給我們提供了非常強(qiáng)大的類庫(kù)(又一次吹捧了.NET一番)
    2013-09-09
  • C# List實(shí)現(xiàn)行轉(zhuǎn)列的通用方案

    C# List實(shí)現(xiàn)行轉(zhuǎn)列的通用方案

    本篇通過(guò)行轉(zhuǎn)列引出了System.Linq.Dynamic,并且介紹了過(guò)濾功能,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • C# BitArray點(diǎn)陣列的使用

    C# BitArray點(diǎn)陣列的使用

    本文主要介紹了C# BitArray點(diǎn)陣列的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 在C#中如何使用JSON

    在C#中如何使用JSON

    JSON(JavaScript?Object?Notation)是一種輕量級(jí)的數(shù)據(jù)交換格式,具有易讀、易解析的特點(diǎn),廣泛用于API數(shù)據(jù)交互、配置文件等,本文介紹在C#中如何使用JSON,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • C#實(shí)現(xiàn)偽裝文件夾功能

    C#實(shí)現(xiàn)偽裝文件夾功能

    這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)偽裝文件夾的功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • 簡(jiǎn)單對(duì)比C#程序中的單線程與多線程設(shè)計(jì)

    簡(jiǎn)單對(duì)比C#程序中的單線程與多線程設(shè)計(jì)

    這篇文章主要介紹了C#程序中的單線程與多線程設(shè)計(jì)的簡(jiǎn)單對(duì)比,通過(guò)實(shí)際的代碼演示可以清晰看出多線程并發(fā)來(lái)避免單線程阻塞問(wèn)題的特點(diǎn),需要的朋友可以參考下
    2016-04-04
  • 史上最簡(jiǎn)潔C# 生成條形碼圖片思路及示例分享

    史上最簡(jiǎn)潔C# 生成條形碼圖片思路及示例分享

    這篇文章主要介紹了史上最簡(jiǎn)潔C# 生成條形碼圖片思路及示例分享,需要的朋友可以參考下
    2015-01-01
  • 在C#中List集合使用First()方法獲取第一個(gè)元素的操作

    在C#中List集合使用First()方法獲取第一個(gè)元素的操作

    這篇文章主要介紹了在C#中List集合使用First()方法獲取第一個(gè)元素的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-12-12
  • C# WebApi 接口返回值不困惑:返回值類型詳解

    C# WebApi 接口返回值不困惑:返回值類型詳解

    這篇文章主要介紹了C# WebApi 接口返回值不困惑:返回值類型詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • .NET使用C#設(shè)置Excel單元格數(shù)值格式

    .NET使用C#設(shè)置Excel單元格數(shù)值格式

    這篇文章主要為大家詳細(xì)介紹了如何使用C#在.NET程序中實(shí)現(xiàn)對(duì)Excel單元格數(shù)字格式的設(shè)置,幫助實(shí)現(xiàn)更完善的Excel文件處理,感興趣的小伙伴可以了解下
    2024-12-12

最新評(píng)論

义马市| 海南省| 巩留县| 郧西县| 双牌县| 阿瓦提县| 南涧| 清水河县| 读书| 张掖市| 沁阳市| 自贡市| 松溪县| 榆社县| 和顺县| 噶尔县| 靖远县| 无极县| 永济市| 平昌县| 云南省| 德安县| 延寿县| 平乡县| 固始县| 舒兰市| 凤冈县| 江陵县| 陵水| 苍山县| 磐石市| 封开县| 锡林浩特市| 江华| 昆明市| 察哈| 绥滨县| 罗田县| 巴彦县| 福鼎市| 自贡市|