【问题标题】:c# - Reading commandline args with their associated valuesc# - 读取命令行参数及其相关值
【发布时间】:2015-08-14 16:45:35
【问题描述】:

只是想知道是否有办法在控制台应用程序的命令行中读取值。我可以很容易地在命令行中阅读,但似乎找不到任何有关从命令行获取值的信息。

例如(args):

aTest = 5; bTest = 13;

是否有办法读取 arg aTest 并将其与 int 5... 关联?

谢谢:)

【问题讨论】:

  • 您是否尝试过解析这些值?你现在有什么结果?

标签: c# command-line console-application args command-line-arguments


【解决方案1】:

我很久以前为我编写了一个辅助方法,它提取 swtich 的值或返回(如果存在或不存在) - 这也许会对您有所帮助。

/// <summary>
/// If the arguments are in the format /member=value
/// Than this function returns the value by the given membername (!casesensitive) (pass membername without '/')
/// If the member is a switch without a value and the switch is preset the given ArgName will be returned, so if switch is presetargname means true..
/// </summary>
/// <param name="args">Console-Arg-Array</param>
/// <param name="ArgName">Case insensitive argname without /</param>
/// <returns></returns>
private static string getArgValue(string[] args, string ArgName)
{
    var singleFound = args.Where(w => w.ToLower() == "/" + ArgName.ToLower()).FirstOrDefault();
    if (singleFound != null)
        return ArgName;


    var arg = args.Where(w => w.ToLower().StartsWith("/" + ArgName.ToLower() + "=")).FirstOrDefault();
    if (arg == null)
        return null;
    else
        return arg.Split('=')[1];
}

示例:

static void Main(string[] args)
 {
    var modeSwitchValue = getArgValue(args, "mode");
    if (modeSwitchValue == null)
    {
        //Argument not present
        return;
    }
    else
    { 
        //do something
    }
  }

【讨论】:

  • 啊,太好了-谢谢! arg.Split 我不知道这个功能!谢谢你:):) c# nub :/
  • @Anonagon 如果它符合您的要求 - 标记为答案 plz ;)
  • 为什么不将语句移到 FirstOrDefault 中? args.FirstOrDefault(w => w.ToLower() == "/" + ArgName.ToLower());应该产生相同的结果,与第二条语句相同。
【解决方案2】:

这适用于您提供的输入:

var args = "aTest = 5; bTest = 13;";

var values =
    args
        .Split(new [] { ';' }, StringSplitOptions.RemoveEmptyEntries)
        .Select(x => x.Trim().Split('=').Select(y => y.Trim()).ToArray())
        .ToDictionary(x => x[0], x => int.Parse(x[1]));

我得到这个结果:

【讨论】: