C#/.NET 使用 CommandLineParser 来标准化地解析命令行
CommandLineParser 是一款用于解析命令行参数的 NuGet 包。你只需要关注你的业务,而命令行解析只需要极少量的配置代码。
本文将介绍如何使用 CommandLineParser 高效写出自己程序的命令行解析部分。
NuGet 包和 GitHub 开源仓库
- NuGet 包:CommandLineParser
- GitHub 开源仓库:commandlineparser/commandline
最简单的命令行解析
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 是命令行的无名参数,它是靠在命令行谓词后面的参数位置来确定解析到哪一个属性上的。
参考资料
- commandlineparser/commandline: The best C# command line parser that brings standardized *nix getopt style, for .NET. Includes F# support
- Home · commandlineparser/commandline Wiki
- C#命令行解析工具 - 林德熙
- The week in .NET – Command Line Parser Library, .NET South East - .NET Blog
我的博客会首发于 https://walterlv.com/,而 CSDN 和博客园仅从其中摘选发布,而且一旦发布了就不再更新。

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://blog.csdn.net/wpwalter),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
C#/.NET 使用 CommandLineParser 来标准化地解析命令行的更多相关文章
- .net core/.net 使用 CommandLineParser 来标准化地解析命令行
CommandLineParser 是一款用于解析命令行参数的 NuGet 包.你只需要关注你的业务,而命令行解析只需要极少量的配置代码. 本文将介绍如何使用 CommandLineParser 高效 ...
- 使用 Apache Commons CLI 解析命令行参数示例
很好的输入参数解析方法 ,转载记录下 转载在: https://www.cnblogs.com/onmyway20xx/p/7346709.html Apache Commons CLI 简介 Apa ...
- 使用ACE_Get_Opt解析命令行
当我们用C++开发一些C++控制台小工具时,会需要一些用户输入的参数来决定程序如何工作和执行,而用户输入参数的方式大部分都是采用命令行参数的方式. 比如上一篇文章 玩转Windows服务系列--命令行 ...
- boost之program_options库,解析命令行参数、读取配置文件
一.命令行解析 tprogram_options解析命令行参数示例代码: #include <iostream> using namespace std; #include <boo ...
- ACE_Get_Opt解析命令行
ACE_Get_Opt是一种解析命令行参数选项的迭代器. 1:构造方法 ACE_Get_Opt需要引用头文件,#include "ace/Get_Opt.h". ACE_Get_O ...
- shell解析命令行的过程以及eval命令
本文说明的是一条linux命令在执行时大致要经过哪些过程?以及这些过程的大致顺序. 1.1 shell解析命令行 shell读取和执行命令时的大致操作过程如下图: 以执行以下命令为例: echo -e ...
- optparse模块解析命令行参数的说明及优化
一.关于解析命令行参数的方法 关于“解析命令行参数”的方法我们一般都会用到sys.argv跟optparse模块.关于sys.argv,网上有一篇非常优秀的博客已经介绍的很详细了,大家可以去这里参考: ...
- python解析命令行参数
常常需要解析命令行参数,经常忘记,好烦,总结下来吧. 1.Python 中也可以所用 sys 的 sys.argv 来获取命令行参数: sys.argv 是命令行参数列表 参数个数:len(sys.a ...
- linux 中解析命令行参数(getopt_long用法)
linux 中解析命令行参数(getopt_long用法) http://www.educity.cn/linux/518242.html 详细解析命令行的getopt_long()函数 http:/ ...
随机推荐
- HDU 6015 Skip the Class
Skip the Class 代码: #include<bits/stdc++.h> using namespace std; #define ll long long #define l ...
- English trip -- VC(情景课)10 A Get ready 预备课
Words dance 跳舞 exercise 运动:锻炼 fish 鱼 play basketball 打篮球 play cards 玩牌 swim 游泳 decorations 装饰品 ...
- 4-3 atom订阅源
部分章节还没有实做练习. 网上购买了安道的Rails指南中文版.联系了这个作者问了一个问题Rails5的翻译问题. try(), 判断是否存在,不存在的话返回nil.例子:pasting @perso ...
- Zepto常见问题
Zepto遇到的问题 延时 总所周知,默认click事件,会有300ms的延时问题,Zepto的tap事件很好的解决了这个问题.但是也挖了一个大坑. 点透 Zepto的点透应该也是大家比较熟悉的了.当 ...
- hdu-4023-博弈(模拟)
Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65768/65768 K (Java/Others)Total Submis ...
- zzuli1985(dp/水dfs郑轻比赛)
再一次感受到dp的威力 1985: 即将到来的新生赛 Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 112 Solved: 28 SubmitStat ...
- UVA-818 Cutting Chains (位压缩+暴力搜索)
题目大意:一种环能打开和闭合.现在有n(1<=n<=15)个编号为1~n的环错综复杂的连接着,要打开一些环重新连接使这n个环能构成一条链,问最少需要打开几次环可达到目的? 题目分析:用二进 ...
- Application 类
Application 类具有用于启动和停止应用程序和线程以及处理 Windows 消息的方法,如下所示: Run 在当前线程上启动应用程序消息循环,并可以选择使某窗体可见. Exit 或 ExitT ...
- 变形CSS3
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> < ...
- 未能加载文件或程序集“LinqToExcel”或它的某一个依赖项。试图加载格式不正确的程序。
未能加载文件或程序集“*”或它的某一个依赖项.试图加载格式不正确的程序. 原因:操作系统是64位的,但发布的程序引用了一些32位的ddl,所以出现了兼容性的问题解决方案一:如果是64位机器,IIS—— ...