.net 如何从控制台应用程序中以Dictionary〈string,string>的形式获取命名参数?

omtl5h9j  于 2023-05-02  发布在  .NET
关注(0)|答案(5)|浏览(133)

我有一个名为MyTool的控制台应用程序。exe
什么是最简单的方法来收集传递给这个控制台应用程序的命名参数,然后把它们放在一个Dictionarty<string, string>()中,这个Dictionarty<string, string>()将参数名作为键,值作为参数?
例如:

MyTool foo=123432 bar=Alora barFoo=45.9

我应该能够得到一本字典,它将:

MyArguments["foo"]=123432 
MyArguments["bar"]="Alora"
MyArguments["barFoo"]="45.9"
tjvv9vkg

tjvv9vkg1#

使用此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);
  }
}
wtzytmuj

wtzytmuj2#

以下是如何以最简单的方式做到这一点:

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];
            }
        }
    }

请注意:

  • 参数名区分大小写
  • 多次提供相同的参数名不会产生错误
  • 不允许有空格
  • 必须使用一个=符号
umuewwlo

umuewwlo3#

如果参数值中有“=”,则更安全选项为:

private static Dictionary<string, string> ResolveArguments(string[] args)
{
    if (args == null)
        return null;

    if (args.Length > 0)
    {
        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;
}
hk8txs48

hk8txs484#

我不明白为什么这个代码是坏的?霍瓦?

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....
            }
bqujaahr

bqujaahr5#

您可以使用Microsoft。Extensions.Configuration.命令行

IConfiguration configuration = new ConfigurationBuilder()
    .AddJsonFile("appsettings.json", optional: true)
    .AddEnvironmentVariables()
    .AddCommandLine(args) // here
    .Build();

然后你可以像这样执行你的应用程序:

MyConsoleApplication.exe --myParameterName myvalue

查看this blog post和文档了解详细信息。

相关问题