【问题标题】:Getting parameters after argument in command line在命令行中获取参数后的参数
【发布时间】:2021-01-05 10:16:28
【问题描述】:

您好,我想在用户输入 --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)

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

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

谢谢

【问题讨论】:

  • 几个小时前已经问过并针对命令行解析器的问题...已删除并重新发布。知道这样做很烦人,尤其是花时间帮助的人。如果需要帮助,您应该改进最初的问题和/或等待更多帮助。
  • 很抱歉,但是stackoverflow.com/questions/491595/… 这对我没有多大帮助,因为它对我目前所学的东西来说太复杂了,正如我之前所说的,我是新手,这个概念对我来说很难理解。
  • 您应该使用标准化的google.com/search?q=github+c%23+commandline+parser,尤其是对于复杂的参数。
  • 如果我创建一个将命令行参数作为输入的函数,但我将如何返回这些值?

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


【解决方案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

【讨论】:

  • 非常感谢,我会试试这个:)。我们被告知不要使用现有的命令行解析器框架(我什至不知道那些存在)。
  • 嗨,我可以再问两个问题吗,很抱歉打扰了,我真的不擅长这个。如何将其限制为--dimensions 之后的两个条目?如何访问或存储这两个条目以供以后使用?再次感谢您,如果打扰了,请见谅。
  • @j_m 要存储条目,您可以将它们分配给已经存在的变量 value1value2,如下所示:value1 = results[0]value2 = results[1]。使用索引器[&lt;index&gt;] 访问值时,您必须确保要访问的索引位置处的项目确实存在,否则将引发异常。像这样保存条目也不需要将结果集限制为两个条目。
猜你喜欢
  • 1970-01-01
  • 2019-12-04
  • 2015-08-28
  • 1970-01-01
  • 2014-01-03
  • 2018-06-14
  • 2017-03-16
  • 2014-01-18
  • 1970-01-01
相关资源
最近更新 更多