gek*_*k0n 8 c# command-line command-line-arguments command-line-parser
我有一节课:
class Options
{
// Remainder omitted (verb1, verb2, verb3)
[HelpVerbOption]
public string GetUsage(string verb)
{
return HelpText.AutoBuild(this, verb);
}
}
Run Code Online (Sandbox Code Playgroud)
在本文档中(在最后一部分中)说:
...如果用户请求帮助索引,解析器也会将null传递给主类GetUsage(字符串):
$ git帮助
或者如果用户明确请求如何使用特定动词的说明,则使用verb命令:
$ git help commit
...
我尝试输入类型:MyApp.exe help verb1但只能看到基本帮助(好像我输入了错误的动词,help动词或其他内容).但我希望看到与指定动词相关的帮助消息.为什么它不起作用?
在您的应用程序中,它的功能是否正常工作?
对我来说,它可以使用上述方法,但前提是我在不使用--help- 选项的情况下调用我的应用程序(例如MyApp batch)。当我使用时,MyApp --help batch行为正如您所描述的那样。
然而,我们似乎可以\xc2\xb4t 得到同样的结果以用于help- 选项。
编辑:我设法通过修改Commandline.Parser.cs以下代码来使其工作:
private bool TryParseHelpVerb(string[] args, object options, Pair<MethodInfo, HelpVerbOptionAttribute> helpInfo, OptionMap optionMap)\n{\n var helpWriter = _settings.HelpWriter;\n if (helpInfo != null && helpWriter != null)\n {\n if (string.Compare(args[0], helpInfo.Right.LongName, GetStringComparison(_settings)) == 0)\n {\n // User explicitly requested help\n var verb = args.FirstOrDefault(); // <----- change this to args[1];\n if (verb != null)\n {\n var verbOption = optionMap[verb];\n if (verbOption != null)\n {\n if (verbOption.GetValue(options) == null)\n {\n // We need to create an instance also to render help\n verbOption.CreateInstance(options);\n }\n }\n }\n DisplayHelpVerbText(options, helpInfo, verb);\n return true;\n }\n }\n\n return false;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n问题出现在该行
\n\nvar verb = args.FirstOrDefault();\nRun Code Online (Sandbox Code Playgroud)\n\n由于第一个参数 ( args[0]) 被解释为动词或更好的操作(如文档中所述)verb将始终位于help此处。因此,我们将其替换为args[1]包含实际动词的,例如commit。
EDIT2:为了使这项工作也适用,我们还应该从-character中--help修剪第一个 arg ( args[0])-
if (string.Compare(args[0].Trim('-'), helpInfo.Right.LongName, GetStringComparison(_settings)) == 0)\nRun Code Online (Sandbox Code Playgroud)\n