使用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.pswp.cn/web/14417.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14417.shtml
英文地址,請注明出處:http://en.pswp.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查詢優化有…