在命令行中获取参数后的参数

Getting parameters after argument in command line

您好,我正在尝试在用户输入 --dimensions 后获取这两个值。

例如当我这样做时:dotnet app.dll --dimensions 1 2(在命令行中)

它打印

1
2

这是我想要的结果。

但是当我这样做时:dotnet app.dll --test --dimensions 1 2

它 returns hi,意味着 --test 有效。但是 return 是 --dimensions

的错误
hi
Unhandled exception. System.FormatException: Input string was not in a correct format.
   at System.Number.ThrowOverflowOrFormatException(ParsingStatus status, TypeCode type)
   at System.String.System.IConvertible.ToInt32(IFormatProvider provider)
   at System.Convert.ToInt32(Object value)
   at MainClass.Main(String[] args)

我不希望该参数仅在给出第一个参数时才起作用。这就是为什么我在 --dimensions

之前添加了 --test

我希望它在参数 --dimensions 放在任何地方时都能工作。

例如dotnet app.dll --test --test --dimensions 1 2 --test

哪个应该return

hi
hi
1
2
hi

我也是新手 :( 抱歉。

代码:

using System;

class MainClass
{
    private static int value1, value2;
    static void Main(string[] args)
    {
        foreach (string value in args)
        {
            int for_dimensions = 0;

            string testing = "--test";

            if (value == "--dimensions" && args.Length >= for_dimensions + 2)
            {
                object test1 = args.GetValue(for_dimensions+1);
                value1 = Convert.ToInt32(test1);
                    
                object test2 = args.GetValue(for_dimensions + 2);
                value2 = Convert.ToInt32(test2);

                Console.WriteLine(value1);
                Console.WriteLine(value2);
            }

            if (value == testing)
            {
                Console.WriteLine("hi");
            }
            
        }
        
    }
}

谢谢

如果您不想使用现有的命令行解析器框架(我强烈推荐它,因为它具有更高的灵活性)例如 this,您可以像这样获得所需的输出:

// Find array index of "--dimensions"
var argIndex = Array.IndexOf(args, "--dimensions");

// Get remaining array size (all items after "--dimensions")
var subArraySize = args.Length - argIndex - 1;
string[] subArray = new string[subArraySize];

// Put all remaining items (all items after "--dimensions") into new array
Array.Copy(args, argIndex + 1, subArray, 0, subArraySize);

// Iterate over all items after "--dimensions"
var results = new List<int>();
foreach(var entry in subArray)
{
    // Check if the item is another command, if so we are finished
    if(entry.StartsWith('-'))
        break;
    
    // Item isn't a command, try to parse it to int and if successful add to result set
    if(int.TryParse(entry, out var numEntry))
        results.Add(numEntry);
}

要为“--dimensions”输出找到的参数,只需遍历 results:

foreach(var result in results)
{
    Console.WriteLine(result);
}

通过此实现,您可以处理可变数量的维度输入。就像您的示例 1 和 2 一样,或者只是 1 或 1、2 和 3,例如:

dotnet app.dll --test --test --dimensions 1 2 --test
dotnet app.dll --test --test --dimensions 1 --test
dotnet app.dll --test --test --dimensions 1 2 3 --test