CommandLineParser
是一款用于解析命令行参数的 NuGet 包。你只须要关注你的业务,而命令行解析只须要极少许的配置代码。html
本文将介绍如何使用 CommandLineParser
高效写出本身程序的命令行解析部分。git
NuGet 包: CommandLineParser
GitHub 开源仓库:ide
1 using System; 2 using System.Collections.Generic; 3 using CommandLine; 4 5 namespace Walterlv.Demo 6 { 7 class Program 8 { 9 public class Options 10 { 11 [Option('f', "file", Required = true, HelpText = "须要处理的文件。")] 12 public IEnumerable<string> Files { get; set; } 13 14 [Option('o', "override", Required = false, HelpText = "是否覆盖原有文件。")] 15 public bool Override { get; set; } 16 } 17 18 static void Main(string[] args) 19 { 20 Parser.Default.ParseArguments<Options>(args).WithParsed(Run); 21 } 22 23 private static void Run(Options option) 24 { 25 // 使用解析后的命令行参数进行操做。 26 foreach (var file in option.Files) 27 { 28 var verb = option.Override ? "覆盖" : "使用"; 29 Console.WriteLine($"walterlv 正在{verb}文件 {file}"); 30 } 31 } 32 } 33 }
这个简单的 Demo 程序使用 Options
类来封装命令行参数, Parser.Default.ParseArguments
解析到的参数将存入 Options
类型的实例中。而只须要加上 WithParsed
便可在一个新的方法中使用咱们解析后的 Options
实例。post
这时,在命令行中就可使用命令了:ui
dotnet demo.dll -f C:\Users\lvyi\Desktop\Test.txt
因为咱们标记 Files
是必要属性,因此若是此参数没有指定,将返回命令行的使用说明。此使用说明中就包含了咱们在 Option
参数中编写的 HelpText
。spa
若是一个命令行程序只作一件事情,那么以上代码足以应付大多数的状况。但是有时候一个命令行程序是为了作一类事情的 —— 典型的例子就是 git 程序。当你运行 git 的时候,你能够在 git 后面加一个谓词(动词),表示执行的是哪个命令。后面的参数是每一个命令都不一样的,而且第一个参数是不用指定名称的。命令行
using System; using System.Collections.Generic; using System.Diagnostics; using CommandLine; namespace Walterlv.Demo { [Verb("check", HelpText = "检查")] class CheckOptions { [Value(0, HelpText = "一个 .sln 文件,一个或者多个 .csproj 文件。")] public IEnumerable<string> InputFiles { get; set; } } [Verb("fix", HelpText = "修复")] class FixOptions { [Value(0, HelpText = "一个 .sln 文件,一个或者多个 .csproj 文件。")] public IEnumerable<string> InputFiles { get; set; } [Option('o', "outputFiles", Required = true, HelpText = "修复以后的文件集合。")] public IEnumerable<string> OutputFiles { get; set; } [Option(Required = false, HelpText = "是否自动决定版本号,这将使用冲突版本号中的最新版本。")] public bool AutoVersion { get; set; } } class Program { static int Main(string[] args) { var exitCode = Parser.Default.ParseArguments<CheckOptions, FixOptions>(args) .MapResult( (CheckOptions o) => CheckSolutionOrProjectFiles(o), (FixOptions o) => FixSolutionOrProjectFiles(o), error => 1); return exitCode; } private static int CheckSolutionOrProjectFiles(CheckOptions options) { return 0; } private static int FixSolutionOrProjectFiles(FixOptions options) { return 0; } } }
对于这一段程序,咱们可使用两种不一样的谓词来执行命令:code
dotnet demo.dll check C:\Users\lvyi\Desktop\Test\Test.csproj
dotnet demo.dll fix C:\Users\lvyi\Desktop\Test\Test.csproj -o C:\Users\lvyi\Desktop\TestFix\Test.csproj
Verb 是在一个命令行选项的 Option 类上标记的,用于指定命令的类别。每个 Verb 标记的类别均可以有本身独立的一套命令行参数。htm
Option 是命名的命令行参数。在命令行中,你必须指定命令行缩写或者全称来指定命令行参数的不一样类型。blog
Value 是命令行的无名参数,它是靠在命令行谓词后面的参数位置来肯定解析到哪个属性上的。
原文连接: https://walterlv.com/post/introduce-command-line-parser.html