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

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


NuGet 包和 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

如果你的 Options 类中单次是多单词的短语,那么建议在指定名称的时候为每一个单词之间添加一个空格。这样参数就不会让多个单词连成一片难以辨认。

例如:

public class Options
{
[Option("long-name", Required = true, HelpText = "需要处理的文件。")]
public string LongName { get; set; }
}

那么命令是:

dotnet demo.dll --long-name xxx

如果不指定,那么就是 --longname,这显然不好看。

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

如果一个命令行程序只做一件事情,那么以上代码足以应付大多数的情况。可是有时候一个命令行程序是为了做一类事情的 —— 典型的例子就是 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;
}
}
}

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

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/,而 CSDN 和博客园仅从其中摘选发布,而且一旦发布了就不再更新。

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://blog.csdn.net/wpwalter),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系

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

  1. .net core/.net 使用 CommandLineParser 来标准化地解析命令行

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

  2. 使用 Apache Commons CLI 解析命令行参数示例

    很好的输入参数解析方法 ,转载记录下 转载在: https://www.cnblogs.com/onmyway20xx/p/7346709.html Apache Commons CLI 简介 Apa ...

  3. 使用ACE_Get_Opt解析命令行

    当我们用C++开发一些C++控制台小工具时,会需要一些用户输入的参数来决定程序如何工作和执行,而用户输入参数的方式大部分都是采用命令行参数的方式. 比如上一篇文章 玩转Windows服务系列--命令行 ...

  4. boost之program_options库,解析命令行参数、读取配置文件

    一.命令行解析 tprogram_options解析命令行参数示例代码: #include <iostream> using namespace std; #include <boo ...

  5. ACE_Get_Opt解析命令行

    ACE_Get_Opt是一种解析命令行参数选项的迭代器. 1:构造方法 ACE_Get_Opt需要引用头文件,#include "ace/Get_Opt.h". ACE_Get_O ...

  6. shell解析命令行的过程以及eval命令

    本文说明的是一条linux命令在执行时大致要经过哪些过程?以及这些过程的大致顺序. 1.1 shell解析命令行 shell读取和执行命令时的大致操作过程如下图: 以执行以下命令为例: echo -e ...

  7. optparse模块解析命令行参数的说明及优化

    一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...

  8. python解析命令行参数

    常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...

  9. linux 中解析命令行参数(getopt_long用法)

    linux 中解析命令行参数(getopt_long用法) http://www.educity.cn/linux/518242.html 详细解析命令行的getopt_long()函数 http:/ ...

随机推荐

  1. URAL 1501 Sense of Beauty

    URAL 1501 思路: dp+记忆化搜索 状态:dp[i][j]表示选取第一堆前i个和第二堆前j的状态:0:0多1个              1:0和1相等                2:1 ...

  2. angular5 路由传参的几种方式

    此处介绍三种方式 方式一: 问号后面带的参数, 例如:/product?id=1&name=iphone还可以是: [routerLink]="['/books']" [q ...

  3. box-shadow四周都有阴影

    <style> .shadow{ -webkit-box-shadow: #666 0px 0px 10px; -moz-box-shadow: #666 0px 0px 10px; bo ...

  4. SqlServer使用表值函数汇总

    先谈谈需求,我们先创建一张表,脚本如下: create table Cost ( Id ,) primary key,--编号 CostTime date,--时间 Num int--销售额 ); ' ...

  5. VMware 怎么判断哪台机子试图用混杂模式且不成功

    主要是看个log, 然后推断虚拟端口号 The VMkernel logs at /var/log/vmkernel or /var/log/messages contain entries simi ...

  6. Oracle 小函数的使用

    1.Oracle 正则表达式 经常会有一种需求是查询某个字符在字符串中的数量,可以使用正则表达式regexp_count函数 比如 SELECT regexp_count('0,1,1',',') f ...

  7. 标准API使用小技巧

    以前我始终孜孜不倦的追求完全能满足需求的标准的API,但是在使用的过程中发现,有些API并不能完全完整的满足需求. 导致我一度很纠结. 最后想到一种方式,COPY一份标准的API,然后按照自己的需求改 ...

  8. Error when clicking other button after displaying Popup window(转)

    原文地址:Error when clicking other button after displaying Popup window Hi, I'm developing a custom page ...

  9. UA 列表

    设备 系统 浏览器 User-Agent iPhone IOS QQ浏览器 Mozilla/5.0 (iPhone 84; CPU iPhone OS 10_3_3 like Mac OS X) Ap ...

  10. tensoflow学习入门一

    对于如何创建图并开启session,参考如下 # -- encoding:utf-8 -- import tensorflow as tf # 定义常量矩阵a和矩阵b a=tf.constant([[ ...