在命令行中获取参数后的参数
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
您好,我正在尝试在用户输入 --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