2013-06-26 4 views
0

Я пытаюсь создать какой-то автоматический логин для своего приложения через командную строку. Для этого я думал следующим образом:Разбор параметров командной строки

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, поэтому я боюсь, что в конечном итоге я использую пароль как имя пользователя и наоборот.

+0

Я просто перебирать аргументы и, когда вы сталкиваетесь '-u' следующий аргумент является пользователем; когда вы сталкиваетесь с '-p', следующим аргументом является пароль. – Joey

+0

Вы можете заставить логику проверки использовать Regex. Является ли это приложение консольным приложением или приложением winforms? С помощью консоли точка входа в главную имеет встроенную обработку параметров/аргументов. – ApolloSoftware

ответ

2

Я бы предложил использовать стороннюю библиотеку для разбора аргументов командной строки - это может сделать вашу жизнь намного проще.

Например, в Noda Time используется "Command Line Parser Library", который мы фактически внедряем в источник, а не добавляем его в качестве ссылки на сборку. Это очень просто в использовании - вы просто предоставляете класс с атрибутами, чтобы сказать, какой параметр командной строки соответствует какому свойству. Например, вы можете посмотреть на options for our TZDB compiler.

Ваши потребности могут отличаться, конечно, но вполне вероятно, что есть библиотека, которая их удовлетворит, а если нет, это говорит о том, что, возможно, ваши требования на самом деле слишком сложны для полезной командной строки, и вы можете захотеть другой способ настройки вашего приложения, например через файл, который сам указывается в командной строке.

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);