使用CommandLine库创建.NET命令行应用

CommandLine是一个.NET库,用于创建命令行应用程序。它提供了一种简单的方法来解析命令行参数,并且可以帮助您构建一个功能强大的命令行界面。在本文中,我们将介绍如何使用CommandLine库创建.NET命令行应用程序。

1. 背景

在.NET开发中,我们经常需要创建命令行应用程序。比如一些工具类应用程序,或者一些自动化脚本等。为了方便用户使用这些应用程序,我们通常会提供一个命令行界面,用户可以通过命令行参数来指定应用程序的行为。

然而,处理命令行参数并不是一件容易的事情。通常情况下,我们需要编写大量的代码来解析命令行参数,并且处理各种不同的情况。这不仅会增加我们的工作量,还会增加应用程序的复杂性。

为了简化这个过程,我们可以使用CommandLine库。这是一个.NET库,专门用于创建命令行应用程序。它提供了一种简单的方法来解析命令行参数,并且可以帮助我们构建一个功能强大的命令行界面。

在之前的《用.NET做DDNS动态域名解析和SSL证书申请》文章中,我们在介绍SangServerTool工具时就已经介绍了 CommandLineParser 这个命令行解析库,虽然其使用上非常友好,但是因为这个库积压了很多issue,并且已经很久没有维护了,同时对裁剪的支持也不够好。所以,我们这里介绍一个新的库 CommandLine。

2. CommandLine 介绍

System.CommandLine 是一个由官方维护的为 .NET 应用程序设计的库,专注于简化命令行界面的创建和管理。它旨在帮助开发者构建那些需要解析命令行参数、选项和命令的应用程序,同时提供丰富的功能来支持帮助文本的生成、参数绑定、依赖注入等。

核心功能

  • 命令行参数解析:自动解析用户从命令行输入的参数、选项和命令,减少手动解析的需要。
  • 生成帮助文本:自动生成帮助文本,为用户提供关于如何使用命令行应用的指导。
  • 参数绑定:将命令行输入绑定到应用程序的数据模型或处理逻辑,简化参数处理。
  • 支持自动补全:支持 Tab 键自动补全功能,提高用户使用命令行应用的效率。
  • 响应文件支持:允许用户通过文件输入命令行参数,适用于参数较多的情况。

开发者好处

  • 减少样板代码:开发者可以专注于业务逻辑,而不是处理命令行解析的细节。
  • 易于测试:应用逻辑可以独立于命令行输入分析代码进行测试。
  • 性能优化:库设计考虑到了性能和资源使用,适合开发快速、轻量级的命令行应用。

用户好处

  • 一致性:遵循 POSIX 或 Windows 约定,确保命令行输入的一致性解析。
  • 易用:自动生成的帮助文本和支持的自动补全功能提高了用户体验。

3. 安装CommandLine库

System.CommandLine 库是一个 NuGet 包,可以通过 NuGet 包管理器或者 .NET CLI 来安装。在 Visual Studio 中,可以通过 NuGet 包管理器来搜索并安装 System.CommandLine 包。

dotnet add package System.CommandLine --prerelease

需要注意的是,目前 System.CommandLine 库还处于预览版阶段,所以需要添加 --prerelease 参数来安装预览版的包。

4. 命令定义的使用

这里我们以 SangServerTool 工具为例,来演示如何使用 System.CommandLine 库来定义命令行参数。SangServerTool 含有三个子命令:ddnssslsync,分别对应 DDNS 动态域名解析、SSL 证书申请和远端证书同步功能。

首先,我们需要定义一个 RootCommand 对象,用于表示根命令。

using System.CommandLine;
using System.CommandLine.NamingConventionBinder;// 创建根命令
var rootCommand = new RootCommand("SangServerTool");

然后,我们可以通过 Command 对象来定义子命令和选项。例如,我们可以定义一个 ddns 子命令,并为其添加选项。

// 定义ddns命令
var ddnsCommand = new Command("ddns", "Set DDNS.");
ddnsCommand.AddOption(new Option<string>(new[] { "--config", "-c" }, "Set config json file.") { IsRequired = true});
ddnsCommand.AddOption(new Option<int>("--delay", () => 0, "How many seconds delay?"));
ddnsCommand.AddOption(new Option<bool>("--del", () => false, "Is delete DDNS?"));
ddnsCommand.AddOption(new Option<bool>("--v6", () => false, "Is ipv6?"));

接着,我们需要定义一个处理命令的委托,并将其与命令绑定。

// 定义处理命令的委托
ddnsCommand.Handler = CommandHandler.Create<string, int, bool, bool>((config, delay, del, v6) =>
{// 处理ddns命令Console.WriteLine($"config: {config}");Console.WriteLine($"delay: {delay}");Console.WriteLine($"del: {del}");Console.WriteLine($"v6: {v6}");
});

最后,我们将子命令添加到根命令中,并执行命令行解析。

// 将ddns命令添加到根命令
rootCommand.AddCommand(ddnsCommand);
// 解析并执行命令
return await rootCommand.InvokeAsync(args);

最后

关于 System.CommandLine 库的使用,我们在这里只是做了一个简单的介绍,更多的功能和用法可以参考官方文档。

虽然 System.CommandLine 提供了丰富的功能,但它仍然处于预览版阶段,这意味着在正式发布之前,它可能会发生重大更改。因此,开发者在使用时需要注意版本更新和兼容性问题。不过,考虑到它是由官方维护的库,未来应该会得到更好的支持和维护。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/14417.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringFramework实战指南

二、SpringFramework实战指南 目录 一、技术体系结构 1.1 总体技术体系1.2 框架概念和理解 二、SpringFramework介绍 2.1 Spring 和 SpringFramework概念2.2 SpringFramework主要功能模块2.3 SpringFramework 主要优势 三、Spring IoC容器和核心概念 3.1 组件和组件管理概念3…

起底震网病毒的来龙去脉

2010年&#xff0c;震网病毒被发现&#xff0c;引起世界哗然&#xff0c;在后续的10年间&#xff0c;陆陆续续有更多关于该病毒的背景和细节曝光。今年&#xff0c;《以色列时报》和《荷兰日报》又披露了关于此事件的更多信息&#xff0c;基于这些信息&#xff0c;我们重新梳理…

优于InstantID!中山大学提出ConsistentID:可以仅使用单个图像根据文本提示生成不同的个性化ID图像

给定一些输入ID的图像&#xff0c;ConsistentID可以仅使用单个图像根据文本提示生成不同的个性化ID图像。效果看起来也是非常不错。 相关链接 Code:https://github.com/JackAILab/ConsistentID Paper&#xff1a;https://ssugarwh.github.io/consistentid.github.io/arXiv.pd…

计算机毕业设计 | springboot养老院管理系统 老人社区管理(附源码)

1&#xff0c;绪论 1.1 背景调研 养老院是集医疗、护理、康复、膳食、社工等服务服务于一体的综合行养老院&#xff0c;经过我们前期的调查&#xff0c;院方大部分工作采用手工操作方式,会带来工作效率过低&#xff0c;运营成本过大的问题。 院方可用合理的较少投入取得更好…

Python数据可视化(七)

绘制 3D 图形 到目前为止&#xff0c;我们一直在讨论有关 2D 图形的绘制方法和绘制技术。3D 图形也是数据可视化的 一个很重要的应用方面&#xff0c;我们接下来就重点讲解有关 3D 图形的实现方法。绘制 3D 图形通常需要导 入 mpl_toolkits 包中的 mplot3d 包的相关模块&#x…

三、Gazebo中实现机器人仿真(小白上手)+ubuntu18.04

接上一篇文章 1、\导航 vim .bashrc \先采用Nanocar尝试导航 关闭终端&#xff1a;roslaunch robot_navigation gmapping.launch simulation:true rosrun teleop_twist_keyboard teleop_twist_keyboard.py 重启终端&#xff1a; cd catkin_ws source ./devel/setu…

护网经验面试题目原版

文章目录 一、护网项目经验1.项目经验**Hvv的分组和流程**有没有遇到过有意思的逻辑漏洞&#xff1f;有没有自己开发过武器/工具&#xff1f;有做过代码审计吗&#xff1f;有0day吗有cve/cnvd吗&#xff1f;有src排名吗&#xff1f;有没有写过技战法有钓鱼经历吗&#xff1f;具…

【数据结构】哈夫曼树和哈夫曼编码

一、哈夫曼树 1.1 哈夫曼树的概念 给定一个序列&#xff0c;将序列中的所有元素作为叶子节点构建一棵二叉树&#xff0c;并使这棵树的带权路径长度最小&#xff0c;那么我们就得到了一棵哈夫曼树&#xff08;又称最优二叉树&#xff09; 接下来是名词解释&#xff1a; 权&a…

VC++位移操作>>和<<以及逻辑驱动器插拔产生的掩码dbv.dbcv_unitmask进行分析的相关代码

VC位移操作>>和<<以及逻辑驱动器插拔产生的掩码dbv.dbcv_unitmask进行分析的相关代码 一、VC位移操作符<<和>>1、右位移操作符 >>&#xff1a;2、左位移操作符 <<&#xff1a; 二、逻辑驱动器插拔产生的掩码 dbv.dbcv_unitmask 进行分析的…

如何使用Suno:免费的AI歌曲生成器

文章目录 Suno AI 是什么&#xff1f;Suno AI 如何工作&#xff1f;选择Suno AI的理由&#xff1a;核心优势易于操作多样化创作灵活的定价策略版权保障技术突破 如何使用Suno AI创作歌曲&#xff1f;第1步&#xff1a;注册Suno AI账户第2步&#xff1a;输入提示词创建第 3 步&a…

作业-day-240522

思维导图 使用IO多路复用实现并发 select实现TCP服务器端 #include <myhead.h>#define SER_IP "192.168.125.112" #define SER_PORT 8888int main(int argc, const char *argv[]) {int sfdsocket(AF_INET,SOCK_STREAM,0);if(sfd -1){perror("socket er…

脆皮之“字符函数与字符串函数”宝典

hello&#xff0c;大家好呀&#xff0c;感觉我之前有偷偷摸鱼了&#xff0c;今天又开始学习啦。加油&#xff01;&#xff01;&#xff01; 文章目录 1. 字符分类函数2. 字符转换函数3. strlen的使用和模拟实现3.1 strlen 的使用3.1 strlen 的模拟1.计算器方法2.指针-指针的方…

Python的shutil模块探索,文件操作的瑞士军刀

hello&#xff0c;大家好&#xff0c;我是一点&#xff0c;专注于Python编程&#xff0c;如果你也对感Python感兴趣&#xff0c;欢迎关注交流。 希望可以持续更新一些有意思的文章&#xff0c;如果觉得还不错&#xff0c;欢迎点赞关注&#xff0c;有啥想说的&#xff0c;可以留…

每周刷题第三期

个人主页&#xff1a;星纭-CSDN博客 系列文章专栏&#xff1a;Python 踏上取经路&#xff0c;比抵达灵山更重要&#xff01;一起努力一起进步&#xff01; 目录 题目一&#xff1a;环形链表 题目二&#xff1a;删除有序数组中的重复项 题目三&#xff1a;有效的括号 题…

从左上角到右下角的最小距离和

题目描述&#xff1a;给定一个二维数组matrix&#xff0c;一个人必须从左上角出发&#xff0c;最后到达右下角&#xff0c;沿途只可以向下或者向右走&#xff0c;沿途的数字都累加就是距离累加和&#xff0c;返回最小距离累加和。 way&#xff1a;无他&#xff0c;dp[i] [j]表…

《队列》

描述 学校体操队到操场集合&#xff0c;排成每行2人&#xff0c;最后多出1人;排成每行3人&#xff0c;也多出1人。分别排成每行4、5、6人&#xff0c;都多出1人。当排成每行7人时&#xff0c;正好不多,求校体操队至少多少人。 输入描述 无 输出描述 满足要求的人数 样例输入…

Python语法学习之 - 生成器表达式(Generator Expression)

第一次见这样的语法 本人之前一直是Java工程师&#xff0c;最近接触了一个Python项目&#xff0c;第一次看到如下的代码&#xff1a; i sum(letter in target_arr for letter in source_arr)这条语句是计算source 与 target 数组中有几个单词是相同的。 当我第一眼看到这样…

shell遍历路径所有文件并把列表写成字符串遍历

1. ls dir/* | tr ‘\n’ ’ ’ 换行替换成空格 你可以使用 ls 命令和 tr 命令来将文件列表根据空格拼接起来成一个字符串。以下是一个示例&#xff1a; ls dir/* | tr \n 解释 ls dir/*&#xff1a;列出 dir 目录下的所有文件。tr \n &#xff1a;将所有的换行符&#xf…

ChatGPT生成常见面试题【面试准备】

ChatGPT生成常见面试题【面试准备】 前言版权ChatGPT生成常见面试题【面试准备】MySQL面试问题与回答1. 数据库连接与操作2. 索引和查询优化3. 事务管理4. 索引是什么&#xff1f;为什么使用索引可以提高查询性能&#xff1f;如何在MySQL中创建索引&#xff1f;5. SQL查询优化有…