Как получить именованные аргументы из консольного приложения в виде словаря <string, string>?
У меня есть консольное приложение MyTool.exe
Каков самый простой способ для сбора именованных аргументов, переданных этому консольному приложению, а затем разместить их в Dictionarty<string, string>()
, который будет иметь имя аргумента в качестве ключа и значение в качестве аргумента?
например:
MyTool foo=123432 bar=Alora barFoo=45.9
Я должен иметь возможность получить словарь, который будет:
MyArguments["foo"]=123432
MyArguments["bar"]="Alora"
MyArguments["barFoo"]="45.9"
Ответы
Ответ 1
Используйте этот пакет Nuget
Занимает секунды для настройки и добавления моментального профессионального касания к вашему приложению.
// Define a class to receive parsed values
class Options {
[Option('r', "read", Required = true,
HelpText = "Input file to be processed.")]
public string InputFile { get; set; }
[Option('v', "verbose", DefaultValue = true,
HelpText = "Prints all messages to standard output.")]
public bool Verbose { get; set; }
[ParserState]
public IParserState LastParserState { get; set; }
[HelpOption]
public string GetUsage() {
return HelpText.AutoBuild(this,
(HelpText current) => HelpText.DefaultParsingErrorsHandler(this, current));
}
}
// Consume them
static void Main(string[] args) {
var options = new Options();
if (CommandLine.Parser.Default.ParseArguments(args, options)) {
// Values are available here
if (options.Verbose) Console.WriteLine("Filename: {0}", options.InputFile);
}
}
Ответ 2
Вот как это можно сделать самым простым способом:
static void Main(string[] args)
{
var arguments = new Dictionary<string, string>();
foreach (string argument in args)
{
string[] splitted = argument.Split('=');
if (splitted.Length == 2)
{
arguments[splitted[0]] = splitted[1];
}
}
}
Обратите внимание, что:
- Имена аргументов чувствительны к регистру
- Предоставление одного и того же имени аргумента более одного раза не вызывает ошибки
- Не разрешены пробелы.
- Знак one = должен использоваться
Ответ 3
если у вас есть значение "=" в ваших значениях параметров, более безопасным вариантом будет:
private static Dictionary<string, string> ResolveArguments(string[] args)
{
if (args == null)
return null;
if (args.Length > 1)
{
var arguments = new Dictionary<string, string>();
foreach (string argument in args)
{
int idx = argument.IndexOf('=');
if (idx > 0)
arguments[argument.Substring(0, idx)] = argument.Substring(idx+1);
}
return arguments;
}
return null;
}
Ответ 4
Я не понимаю, почему этот код плохой? хова?
var arguments = new Dictionary<string, string>();
foreach (var item in Environment.GetCommandLineArgs())
{
try
{
var parts = item.Split('=');
arguments.Add(parts[0], parts[1]);
}
catch (Exception ex)
{
// your error handling here....
}