当前位置: 首页 > article >正文

C#开发基础之借用dotnet CLI命令行参数的设计了解命令行构建用法

在这里插入图片描述

前言

在C#开发中,命令行参数是一种重要的机制,用于在程序启动时向应用程序传递配置或指令。无论是构建CLI工具还是配置化启动的桌面程序,掌握命令行参数的用法可以帮助我们设计更灵活的应用程序。
本文将详细介绍C#中命令行参数的基本用法、高级处理技巧以及常见的第三方库,并结合实际代码示例说明。

一、命令行参数的基础用法

1. 命令行参数的基本概念

在C#中,命令行参数通过Main方法的string[] args参数传递。
例如,如果从命令行运行以下命令:

dotnet run arg1 arg2 arg3

args将包含以下值:

args[0] = "arg1";
args[1] = "arg2";
args[2] = "arg3";

2. 示例代码

下面展示了如何在Main方法中处理命令行参数:

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("接收到的命令行参数:");
        for (int i = 0; i < args.Length; i++)
        {
            Console.WriteLine($"参数 {i + 1}: {args[i]}");
        }
    }
}

运行:

dotnet run Hello World

输出:

接收到的命令行参数:
参数 1: Hello
参数 2: World

二、高级命令行参数处理

1. 使用带有键值对的参数

如果需要处理类似--key=value的参数格式,可以进行简单的字符串解析:

using System;

class Program
{
    static void Main(string[] args)
    {
        foreach (var arg in args)
        {
            if (arg.Contains('='))
            {
                var parts = arg.Split('=', 2); // 按等号拆分
                var key = parts[0].TrimStart('-');
                var value = parts[1];
                Console.WriteLine($"Key: {key}, Value: {value}");
            }
            else
            {
                Console.WriteLine($"单一参数: {arg}");
            }
        }
    }
}

运行:

dotnet run --name=dotnet --version=9.0 standalone

输出:

Key: name, Value: dotnet
Key: version, Value: 9.0
单一参数: standalone

2. 解析带有标志的参数

标志参数如-h--help通常是布尔值,用于启用特定功能。示例代码如下:

using System;

class Program
{
    static void Main(string[] args)
    {
        bool showHelp = false;
        foreach (var arg in args)
        {
            if (arg == "-h2" || arg == "--help2")
            {
                showHelp = true;
            }
        }
        if (showHelp)
        {
            Console.WriteLine("Usage: dotnet run [options]");
            Console.WriteLine("Options:");
            Console.WriteLine("  -h2, --help2     Show this message and exit");
        }
        else
        {
            Console.WriteLine("程序运行中...");
        }
    }
}

为了和原命令行区别,我在这里指定键值为h2或者help2
运行:

dotnet run -h2

输出:

Usage: dotnet run [options]
Options:
  -h2, --help2     Show this message and exit

三、使用第三方库简化命令行参数处理

手动解析命令行参数可能会导致代码复杂且容易出错。为了解决这个问题,可以使用第三方库,如 CommandLineParser 或 System.CommandLine。

1. 使用 CommandLineParser

安装 NuGet 包

运行以下命令安装:

dotnet add package CommandLineParser
 <ItemGroup>
   <PackageReference Include="CommandLineParser" Version="2.9.1" />
 </ItemGroup>
示例代码
using CommandLine;
using System;

class Program
{
    public class Options
    {
        [Option('n', "name", Required = true, HelpText = "输入名称。")]
        public string Name { get; set; }

        [Option('v', "version", Required = false, HelpText = "显示版本信息。")]
        public bool Version { get; set; }
    }

    static void Main(string[] args)
    {
        Parser.Default.ParseArguments<Options>(args)
            .WithParsed<Options>(opts =>
            {
                if (opts.Version)
                {
                    Console.WriteLine("版本: 1.0.0");
                }
                else
                {
                    Console.WriteLine($"你好, {opts.Name}!");
                }
            })
            .WithNotParsed(errors =>
            {
                Console.WriteLine("参数解析失败,请检查输入。");
            });
    }
}

运行:

dotnet run --name=dotnet --version

输出:

版本: 1.0.0

2. 使用 System.CommandLine

dotnet sdk中也使用当前包,进行dotnet cli的命令行工具开发
在这里插入图片描述
内部定义关键词
在这里插入图片描述

安装 NuGet 包
dotnet add package System.CommandLine
  <ItemGroup>
    <PackageReference Include="System.CommandLine" Version="2.0.0-beta4.22272.1" />
  </ItemGroup>
示例代码
using System;
using System.CommandLine;
using System.CommandLine.Invocation;

class Program
{
    static void Main(string[] args)
    {
        // 创建根命令
        var rootCommand = new RootCommand("示例命令行工具");
        var nameOption = new Option<string>(
            "--name1",
            description: "输入名称"
        );
        var versionOption = new Option<bool>(
            "--version1",
            description: "显示版本信息"
        );
        rootCommand.AddOption(nameOption);
        rootCommand.AddOption(versionOption);
        rootCommand.SetHandler((string name, bool version) =>
        {
            if (version)
            {
                Console.WriteLine("版本: 1.0.0");
            }
            Console.WriteLine($"你好, {name}!");
        }, nameOption, versionOption);
        var t =  rootCommand.InvokeAsync(args);
        Console.WriteLine(t.Result);
    }
}

为了和默认参数键名区别,我在这里指定键值为–name1和–version1

运行:

dotnet run --name1=dotnet --version1

输出

版本: 1.0.0
你好, dotnet!
0

四、常见的命令行参数格式

命令行参数有不同的传递格式,常见的包括:

  • 短选项(Short Option):通常是单个字符(例如 -f),后面跟一个值。
  • 长选项(Long Option):由一个或多个字符组成,通常使用 – 前缀(例如 --file)。
  • 标志参数(Flag Option):仅表示开关的参数(例如 --enableFeature),不需要值。

五、最佳实践

  1. 为用户提供帮助信息:始终提供--help-h选项。
  2. 校验输入:处理非法参数并提示用户。
  3. 保持一致的参数风格:例如统一使用--key=value格式或短标志-k
  4. 利用第三方库:简化代码,提高可维护性。

六、总结

C#中命令行参数的用法既可以通过手动解析实现,也可以借助第三方库完成高效的参数处理。根据应用的复杂度选择合适的方式,能够帮助开发者构建灵活、可靠的CLI应用。


http://www.kler.cn/a/405536.html

相关文章:

  • 【java-Neo4j 5开发入门篇】-最新Java开发Neo4j
  • RocketMQ: 专业术语以及相关问题解决
  • 巧用观测云可用性监测(云拨测)
  • Python Turtle召唤童年:喜羊羊与灰太狼之懒羊羊绘画
  • 解决Docker环境变量的配置的通用方法
  • Altenergy电力系统控制软件 status_zigbee SQL注入漏洞复现(CVE-2024-11305)
  • Android 在Android.bp或Android.mk文件移除原生内置应用
  • 服务器数据恢复—raid5阵列热备盘上线失败导致EXT3文件系统不可用的数据恢复案例
  • Lumerical脚本——创建基本结构
  • comprehension
  • python文件对象方法
  • @PermitAll注解和@PreAuthorize注解
  • Next.js 开发教程(三):CSS 样式的完整指南
  • VLAN资源池(Java Python JS C++ C )
  • 如何在 React 项目中应用 TypeScript?应该注意那些点?结合实际项目示例及代码进行讲解!
  • 已解决centos7 yum报错:cannot find a valid baseurl for repo:base/7/x86_64的解决方案
  • 【c++笔试强训】(第十六篇)
  • JAVA八股与代码实践----接口与抽象类的区别和用法
  • 利用KDJ指标显示多空K线(附带源码)
  • Unity3D 客户端网络角色的操作与行为分离设计详解
  • 一文详解kafka知识点
  • LayaAir引擎荣获开源大赛一等奖
  • Linux下pwm开发与框架源码分析
  • javaScript之箭头函数
  • 阿里推理模型来了!Marco-o1 发布即开源
  • 飞凌嵌入式T113-i开发板RISC-V核的实时应用方案