将“–help”参数添加到C#控制台应用程序

我通过命令行使用的几乎所有.exe都有一个帮助函数,可以通过“–help”命令调用。

我如何在C#中实现这一点? 是否像检查args []中的参数是否为字符串“–help”一样简单?

用于处理跨多种文化的命令行的AC#片段是……

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

检测逻辑可以与“?”组合 要么 ”/?” 或涵盖所有预期案件的任何其他组合。

注意:当您从环境中获取参数时,加载器将填充arg [0]。 第一个’user’参数在arg [1]中。

使用* 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 == "/?"; } 

是否像检查args []中的参数是否为字符串“–help”一样简单?

是。

这就是为什么不同的控制台程序有时会对如何获取帮助信息有不同的约定。

是。 AFAIK,与编写参数并在屏幕上显示一些字符串相同。

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

我在一小组帮助命令上使用交集。 如果我紧紧地约束你的问题; 它看起来像这样:

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

扩大范围(只是一点点); 我结束了一个名为ParseArgs的方法,该方法返回一个boolean ,如果解析失败需要帮助 ,则返回true。 此方法还有一个out参数,用于存储已解析的程序参数。

  ///  /// Parses the arguments; sets the params struct. ///  /// The argv. /// The parameter structure. /// true if  needed. static bool ParseArgs(IEnumerable 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方法作为静态方法放入参数struct中。
  • catch应该捕获解析exception; 代码不反映这一点。

您可以使用CommandLineParser块包。 然后,您可以创建一个Options类,所有元数据都可以提供帮助和validation。 实现相当惊人和简单。