web-dev-qa-db-ja.com

名前付き引数をコンソールアプリケーションからDictionary <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"
19
pencilCake

この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);
  }
}
22
Mrchief

これを最も簡単な方法で行う方法は次のとおりです。

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

ご了承ください:

  • 引数名では大文字と小文字が区別されます
  • 同じ引数名を複数回指定してもエラーは発生しません
  • スペースは許可されていません
  • 1 =記号を使用する必要があります
6
Kay Zed

パラメータ値に「=」が含まれている場合、より安全なオプションは次のようになります。

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....
            }
0
Stig