2013-06-26 216 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應用程序使用控制檯,main的入口點內置了參數/參數處理。 – 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);