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

时间:2020-09-18 13:05:20

标签: c# .net-core command-line command-line-arguments

嗨,我想在用户输入--dimensions之后获取两个值。

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

它打印

1
2

这是我追求的结果。

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

它返回hi,表示--test有效。但是返回--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)

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

当参数--dimensions放在任何地方时,我希望它起作用。

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

哪个应该回来

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");
            }
            
        }
        
    }
}

谢谢

1 个答案:

答案 0 :(得分:1)

如果您不想使用现有的命令行解析器框架(由于灵活性更高,我强烈建议您使用它),例如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

相关问题