3

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

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

4

6 回答 6

20

使用 *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 == "/?";
}
于 2013-10-22T21:33:40.410 回答
9

用于处理跨多种文化的命令行的 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]。第一个“用户”参数在 arg[1] 中。

于 2013-10-22T21:36:52.030 回答
1

我在一小部分帮助命令上使用了交集。如果我严格限制自己的问题;它最终看起来像这样:

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

扩大范围(只是一点点);我结束了一个调用的方法,如果解析失败需要帮助,则该方法ParseArgs返回booleantrue 。此方法还有一个参数,用于存储已解析的程序参数。 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();
    }

这主要使事情变得非常方便,并允许在 和 之间进行良好的ShowHelp分离ParseArgs

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

        return;
    }

笔记

  • 与其采用ParseArgs一种MainParseArgs体,不如将方法作为静态方法放入参数结构中。
  • catch应该捕获解析异常;代码没有反映这一点。
于 2015-03-03T19:19:05.270 回答
0

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

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

}
于 2013-10-22T21:33:33.853 回答
0

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

是的。

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

于 2013-10-22T21:29:26.527 回答
0

您可以使用 CommandLineParser 块包。然后您可以创建一个 Options 类,为所有元数据提供帮助和验证。非常惊人且易于实现。

于 2017-02-03T01:59:13.690 回答