ZetCode

C# 命令行参数

最后修改于 2023 年 7 月 5 日

在本文中,我们将展示如何在 C# 中使用命令行参数。

命令行参数是传递给控制台程序的值,通常通过终端传递。

我们可以通过声明一个类型为 string[] 的参数,将命令行参数发送到 Main 方法。 使用顶级语句的程序有一个默认的内置 args 变量,其中包含参数。

C# Main 方法中的命令行参数

在第一个示例中,我们将命令行参数传递给 Main 方法。

Program.cs
class Program
{
    static void Main(string[] args)
    {
        foreach (var arg in args)
        {
            Console.WriteLine(arg);
        }
    }
}

在该程序中,我们只是将所有参数打印到控制台。

static void Main(string[] args)

命令行参数具有 string[] 类型。 按照惯例,将变量命名为 args

$ dotnet run John Doe gardener
John
Doe
gardener

C# 没有 Main 方法的命令行参数

如果没有 Main 方法,则可以通过内置变量 args 访问参数。

Program.cs
Console.WriteLine($"You have passed {args.Length} arguments");

foreach (var arg in args)
{
    Console.WriteLine(arg);
}

该程序打印命令行参数的数量并将它们打印到终端。

$ dotnet run 1 2 3 4 5 6
You have passed 6 arguments
1
2
3
4
5
6

C# Environment.GetCommandLineArgs

Environment.GetCommandLineArgs 返回一个字符串数组,其中包含当前进程的命令行参数。

Program.cs
string[] cargs = Environment.GetCommandLineArgs();

Console.WriteLine($"You have passed {cargs.Length} arguments");

foreach (var arg in cargs)
{
    Console.WriteLine(arg);
}

它比默认的内置变量 args 更明确。 此外,Environment.GetCommandLineArgs 将程序名称计为其中一个参数。

$ dotnet run 1 2 3 4 5 
You have passed 6 arguments
/home/jano/Documents/prog/csharp/cmd-args/SimpleEx/bin/Debug/net6.0/SimpleEx.dll
1
2
3
4
5

C# Environment.CommanLine

Environment.CommanLine 返回一个包含命令行参数的字符串。

Program.cs
string cargs = Environment.CommandLine;
Console.WriteLine(cargs);

string[] vals = cargs.Split(" ");

try
{
    int sum = vals.Skip(1).Select(e => Convert.ToInt32(e)).Sum();
    Console.WriteLine($"The sum of values is {sum}");
    return 0;
}
catch (FormatException e)
{
    Console.WriteLine("Invalid input");
    Console.WriteLine(e.Message);
    return 1;
}

该程序期望一个整数列表作为输入。

string cargs = Environment.CommandLine;

我们使用 Environment.CommandLine 获取命令行输入。

string[] vals = cargs.Split(" ");

我们将字符串拆分为多个部分。

int sum = vals.Skip(1).Select(e => Convert.ToInt32(e)).Sum();

我们跳过第一个参数,即程序名称。 我们将字符串转换为整数并计算总和。

catch (FormatException e)
{

解析命令行参数容易出错。 我们可能会得到 FormatExceptions

C# CommandLineParser

命令行解析器库提供了一个简洁明了的 API 来操作命令行参数。

$ dotnet add package CommandLineParser

我们添加 CommandLineParser 包。

Program.cs
namespace CommandLineArgs;

using CommandLine;

class Options
{
    [Option("vals")]
    public IEnumerable<int>? Vals { get; set; }

}

class Program
{
    static void Main(string[] args)
    {
        Parser.Default.ParseArguments<Options>(args).WithParsed<Options>(o =>
        {
            if (o.Vals != null)
            {
                int sum = o.Vals.Sum();
                Console.WriteLine($"The sum is {sum}");
            }
            else
            {
                Console.WriteLine("No arguments");
            }
        });
    }
}

该程序定义了一个 --vals 选项,它接受一个整数序列。

$ dotnet run --vals 1 2 3 4 5 6
The sum is 21

来源

Main 方法和命令行参数

在本文中,我们学习了如何在 C# 中使用命令行参数。

作者

我叫 Jan Bodnar,是一位充满热情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直在撰写编程文章。 迄今为止,我撰写了 1,400 多篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 C# 教程