命令行参数解析

时间:2013-06-26 13:15:41

标签: c# command-line

我试图通过命令行为我的应用程序创建某种自动登录。为此,我想到了以下方式:

myapp.exe /autologin -u "Username" -p "Password"

现在首先:这是正确的方法(在命名和切换方面吗?),第二种:如何解析这个?

我已经尝试过这样,但失败了(或者至少我认为我失败了,因为我必须手动执行字符串操作):

    internal static void SetStartupArguments(List<string> arguments)
    {
        IsApplicationWarmup = arguments.Contains("/warmup");
        IsApplicationAutoLogin = arguments.Contains("/autologin");

        if (IsApplicationAutoLogin)
        {
            int autoLoginIndex = arguments.FindIndex(0, str => str == "/autologin");

            if (arguments.Count >= autoLoginIndex + 1)
            {
                AutoLoginUser = arguments[autoLoginIndex + 1];
                AutoLoginPassword = string.Empty;
            }
        }
    }

另一件事是,这很容易出错。我无法判断-u或-p开关是否排在第一位,所以我担心最终会使用密码作为用户名,反之亦然。

2 个答案:

答案 0 :(得分:2)

我建议使用第三方库进行命令行参数解析 - 它可以让你的生活更简单。

例如,在Noda Time中我们使用"Command Line Parser Library",我们实际上将其嵌入到源中,而不是将其添加为程序集引用。它使用起来非常简单 - 您只需提供一个具有属性的类来说明哪个命令行选项对应于哪个属性。您可以查看options for our TZDB compiler作为示例。

您的需求可能会有所不同,但可能会有一个满足它们的库 - 如果没有,这表明您的要求实际上对于有用的命令行来说实际上太复杂了,您可能需要一些配置应用程序的其他方式,例如通过在命令行中指定的文件。

答案 1 :(得分:2)

我使用像https://github.com/fschwiet/ManyConsole这样的东西,它是NDesk.Options的扩展,非常容易用于解析命令行。

示例:

   string data = null;
   bool help   = false;
   int verbose = 0;
   var p = new OptionSet () {
    { "file=",      v => data = v },
    { "v|verbose",  v => { ++verbose } },
    { "h|?|help",   v => help = v != null },
   };
   List<string> extra = p.Parse (args);