CommandLineParser 是一款用于解析命令行参数的 NuGet 包。你只需要关注你的业务,而命令行解析只需要极少量的配置代码。

本文将介绍如何使用 CommandLineParser 高效写出自己程序的命令行解析部分。

NuGet 包和 GitHub 开源仓库


NuGet 包: CommandLineParser
GitHub 开源仓库:

最简单的命令行解析


 using System;
using System.Collections.Generic;
using CommandLine; namespace Walterlv.Demo
{
class Program
{
public class Options
{
[Option('f', "file", Required = true, HelpText = "需要处理的文件。")]
public IEnumerable<string> Files { get; set; } [Option('o', "override", Required = false, HelpText = "是否覆盖原有文件。")]
public bool Override { get; set; }
} static void Main(string[] args)
{
Parser.Default.ParseArguments<Options>(args).WithParsed(Run);
} private static void Run(Options option)
{
// 使用解析后的命令行参数进行操作。
foreach (var file in option.Files)
{
var verb = option.Override ? "覆盖" : "使用";
Console.WriteLine($"walterlv 正在{verb}文件 {file}");
}
}
}
}

这个简单的 Demo 程序使用 Options 类来封装命令行参数, Parser.Default.ParseArguments 解析到的参数将存入 Options 类型的实例中。而只需要加上 WithParsed 即可在一个新的方法中使用我们解析后的 Options 实例。

这时,在命令行中就可以使用命令了:

dotnet demo.dll -f C:\Users\lvyi\Desktop\Test.txt

由于我们标记 Files 是必要属性,所以如果此参数没有指定,将返回命令行的使用说明。此使用说明中就包含了我们在 Option 参数中编写的 HelpText 。

包含多个方法的命令行解析


如果一个命令行程序只做一件事情,那么以上代码足以应付大多数的情况。可是有时候一个命令行程序是为了做一类事情的 —— 典型的例子就是 git 程序。当你运行 git 的时候,你可以在 git 后面加一个谓词(动词),表示执行的是哪一个命令。后面的参数是每个命令都不同的,并且第一个参数是不用指定名称的。

using System;
using System.Collections.Generic;
using System.Diagnostics;
using CommandLine; namespace Walterlv.Demo
{
[Verb("check", HelpText = "检查")]
class CheckOptions
{
[Value(, HelpText = "一个 .sln 文件,一个或者多个 .csproj 文件。")]
public IEnumerable<string> InputFiles { get; set; }
} [Verb("fix", HelpText = "修复")]
class FixOptions
{
[Value(, 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 => );
return exitCode;
} private static int CheckSolutionOrProjectFiles(CheckOptions options)
{
return ;
} private static int FixSolutionOrProjectFiles(FixOptions options)
{
return ;
}
}
}

对于这一段程序,我们可以使用两种不同的谓词来执行命令:

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 和 Value


Verb 是在一个命令行选项的 Option 类上标记的,用于指定命令的类别。每一个 Verb 标记的类别都可以有自己独立的一套命令行参数。

Option 是命名的命令行参数。在命令行中,你必须指定命令行缩写或者全称来指定命令行参数的不同类型。

Value 是命令行的无名参数,它是靠在命令行谓词后面的参数位置来确定解析到哪一个属性上的。

原文链接: https://walterlv.com/post/introduce-command-line-parser.html

.net core/.net 使用 CommandLineParser 来标准化地解析命令行的更多相关文章

  1. C#/.NET 使用 CommandLineParser 来标准化地解析命令行

    CommandLineParser 是一款用于解析命令行参数的 NuGet 包.你只需要关注你的业务,而命令行解析只需要极少量的配置代码. 本文将介绍如何使用 CommandLineParser 高效 ...

  2. .Net Core IIS下无Log4Net日志输出,命令行下却有(dotnet运行)

    .Net Core IIS下无Log4Net日志输出,命令行下却有(dotnet运行) 遇到个诡异的问题,项目发布并寄宿到 IIS上后,Log4Net没有日志输出 1.原因分析 这不应该啊,所有的配置 ...

  3. .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]

    较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...

  4. .NET Core系列 : 1、.NET Core 环境搭建和命令行CLI入门

    2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文章,原因是.NET Core的入门门槛相当高, ...

  5. 『.NET Core CLI工具文档』(一).NET Core 命令行工具(CLI)

    说明:本文是个人翻译文章,由于个人水平有限,有不对的地方请大家帮忙更正. 原文:.NET Core Command Line Tools 翻译:.NET Core命令行工具 什么是 .NET Core ...

  6. NET Core 环境搭建和命令行CLI入门

    NET Core 环境搭建和命令行CLI入门 2016年6月27日.NET Core & ASP.NET Core 1.0在Redhat峰会上正式发布,社区里涌现了很多文章,我也计划写个系列文 ...

  7. ASP.NET Core:CMD命令行+记事本 创建Console程序和Web Application

    今天看了Scott关于ASP.NET Core的介绍视频,发现用命令行一步一步新建项目.添加Package.Restore.Build.Run 执行的实现方式,更让容易让我们了解.NET Core的运 ...

  8. .Net Core从命令行读取配置文件

    最近在学习博客园腾飞(jesse)的.Net Core视频教程,收益匪浅,在此作推荐 : http://video.jessetalk.cn/ 言归正传,.Net Core应用程序中如何通过命令行读取 ...

  9. 使用.NET Core快速开发一个较正规的命令行应用程序

    程序员的世界,命令行工具一直是"体验非常友好"的工具,也能自动化完成很多事情,同时还能结合shell来进行某项任务的批处理(脚本).在.NET Core中,命令行应用程序是基础,但 ...

随机推荐

  1. C#跨域

    //在ConfigureServices中配置 #region 跨域 var urls = "*";//Configuration["AppConfig:Cores&qu ...

  2. Spring Boot 集成Jsp与生产环境部署

    一.简介 提起Java不得不说的一个开发场景就是Web开发,也是Java最热门的开发场景之一,说到Web开发绕不开的一个技术就是JSP,因为目前市面上仍有很多的公司在使用JSP,所以本文就来介绍一下S ...

  3. [转]C#委托的异步调用

    本文将主要通过“同步调用”.“异步调用”.“异步回调”三个示例来讲解在用委托执行同一个“加法类”的时候的的区别和利弊. 首先,通过代码定义一个委托和下面三个示例将要调用的方法: ); //模拟该方法运 ...

  4. Spring_注解形式的配置

    1.spring配置: 扫描被下面的注解所注解的类, 把这些类直接配置为bean. 例如: @Controller @Service @Repository @Component 这四个注解 Cont ...

  5. 吴恩达《机器学习》课程总结(5)_logistic回归

    Q1分类问题 回归问题的输出可能是很大的数,而在分类问题中,比如二分类,希望输出的值是0或1,如何将回归输出的值转换成分类的输出0,1成为关键.注意logistics回归又称 逻辑回归,但他是分类问题 ...

  6. css3之属性选择器

    总体来看一下都有哪些选择器 1.属性选择器  1)[att*=val] 2)[att^=val] 3)[att$=val] 2.结构伪类选择器 3.UI伪类选择器 其中E:read-only伪类选择器 ...

  7. tomcat文件目录结构及功能介绍

    tomcat-7.0.50解压版,主目录一览: 我们可以看到主目录下有bin,conf,lib,logs,temp,webapps,work 7个文件夹,下面对他们分别进行介绍: 如下介绍: bin目 ...

  8. getBoundingClientRect介绍

    getBoundingClientRect用于获取元素相对与浏览器视口的位置 由于getBoundingClientRect()已经是w3c标准,所以不用担心兼容,不过在ie下还是有所区别 { top ...

  9. 一个网页登陆界面写30多个测试Case——测试之道

    转自博文:http://www.cnblogs.com/I-am-Betty/p/3566411.html 具体需求: 有一个登陆页面, (假如上面有2个textbox, 一个提交按钮. 请针对这个页 ...

  10. spring源码学习之AOP(一)

    继续源码学习,看了spring中基础的容器和AOP感觉自己也没有什么长进,哈哈,我也不知道到底有用没有,这可能是培养自己的一种精神吧,不管那么多,继续学习!AOP中 AOP中几个重要的概念:(1)Ad ...