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

时间:2024-11-27 21:03:40

在这里插入图片描述

前言

在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

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

手动解析命令行参数可能会导致代码复杂且容易出错。为了解决这个问题,可以使用第三方库,如 CommandLineParserSystem.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应用。