2013-10-22 144 views
1

幾乎所有通過命令行使用的.exe的幫助功能都可以通過「--help」命令調用。將「--help」參數添加到C#控制檯應用程序

如何在C#中實現此目的?是否像檢查args []中的參數是否爲字符串「--help」一樣簡單?

+3

是的,它就這麼簡單。 –

+0

你爲什麼不使用NDesk呢? –

回答

4

A C#代碼片段在多個文化處理命令行...

 string[] args = Environment.GetCommandLineArgs(); 
     if (args.Length == 2) 
     { 
      if (args[1].ToLower(CultureInfo.InvariantCulture).IndexOf("help", System.StringComparison.Ordinal) >= 0) 
      { 
       // give help 
      } 
     } 

檢測邏輯可以結合「?」要麼 」/?」或涵蓋所有預期情況的任何其他組合。

注意:當您從環境獲取參數時,arg [0]由​​加載程序填充。第一個'用戶'參數在arg [1]中。

+1

感謝您提供跨文化的方法。但是,我沒有檢查代碼是否編譯,但它看起來不錯。 – user2450099

+0

我在4和4.5上編譯它 –

0

是否像檢查args []中的參數是否是字符串「--help」一樣簡單?

是的。

這就是爲什麼不同的控制檯程序有時如何獲得幫助信息有不同的約定。

0

是的。 AFAIK,與編譯參數和在屏幕上顯示一些字符串相同。

static void Main(string[] args) 
{ 
    if( args != null && args.Length == 1) 
    { 
     if(args[0].ToLower() == "help") 
     { 
      ShowHelpHere(); 
     } 
    } 

} 
12

隨着* nix的命令,這是常見的或者通過-h--help以獲得幫助。許多windows命令將提供/?的幫助。因此,這不是不好的做法,這樣做:

public static void Main(string[] args) 
{ 
    if (args.Length == 1 && HelpRequired(args[0])) 
    { 
     DisplayHelp(); 
    } 
    else 
    { 
     ... 
    } 
} 

private static bool HelpRequired(string param) 
{ 
    return param == "-h" || param == "--help" || param == "/?"; 
} 
+0

@Christoph,有很好的編輯。不知道'='而不是'=='如何倖免於未被發現近兩年! :) –

+0

不知道,可能是因爲你必須編輯至少6個字符。 但我通過向該方法添加靜態「黑客入侵」。 ;) –

+0

@ChristophBrückmann,啊,這很有道理。我只是假設'static'是你的代碼改進,而不是「黑客」,因爲我忘記了6個字符的限制。無論如何感謝兩個修復:) –

0

我在一小組幫助命令集上使用交集。如果我嚴格限制你自己的問題;它看起來像這樣:

static bool ShowHelpRequired(IEnumerable<string> args) 
{ 
    return args.Select(s => s.ToLowerInvariant()) 
     .Intersect(new[] { "help", "/?", "--help", "-help", "-h" }).Any(); 
} 

擴大範圍(只是一點);我結束了一種叫做ParseArgs的方法,返回boolean,如果要麼要麼解析失敗需要幫助是真的。此方法還有一個存儲解析的程序參數的out參數。

/// <summary> 
    /// Parses the arguments; sets the params struct. 
    /// </summary> 
    /// <param name="argv">The argv.</param> 
    /// <param name="paramStruct">The parameter structure.</param> 
    /// <returns>true if <see cref="ShowHelp"/> needed.</returns> 
    static bool ParseArgs(IEnumerable<string> argv, out ParamStruct paramStruct) 
    { 
     paramStruct = new ParamStruct(); 

     try { /* TODO: parse the arguments and set struct fields */ } 
     catch { return false; } 

     return argv.Select(s => s.ToLowerInvariant()).Intersect(new[] { "help", "/?", "--help", "-help", "-h" }).Any(); 
    } 

這使事情在主很方便,並允許ShowHelpParseArgs之間的良好分離。

if (!ParseArgs(argv, out parameters)) 
    { 
     ShowHelp(); 

     return; 
    } 

  • 代替在Main一個變型具有ParseArgs的是將ParseArgs方法進入參數結構作爲一個靜態方法。
  • catch應該只有捕獲解析異常;代碼不反映這一點。
0

您可以使用CommandLineParser塊包。然後你可以創建一個Options類,所有元數據來提供幫助和驗證。相當驚人和簡單的實施。

相關問題