HelpVerbOption 不工作 - 命令行解析器 C#

Posted

技术标签:

【中文标题】HelpVerbOption 不工作 - 命令行解析器 C#【英文标题】:HelpVerbOption is not working - Command Line Parser C# 【发布时间】:2016-12-28 23:45:46 【问题描述】:

我有一堂课:

class Options

    // Remainder omitted (verb1, verb2, verb3)
    [HelpVerbOption]
    public string GetUsage(string verb)
    
        return HelpText.AutoBuild(this, verb);
    

docs 说:

[...] 解析器也会将 null 传递给主类 GetUsage(string) 如果 用户请求帮助索引:

$ git 帮助

如果用户明确请求,则为动词命令 关于如何使用特定动词的说明:

$ git 帮助提交

[...]

然后,我输入了MyApp.exe help verb1,但我只能看到基本帮助(看起来我输入了错误的动词,或者help 动词,或者其他什么)。相反,我希望它显示与指定动词相关的帮助信息。为什么它不能正常工作?

【问题讨论】:

【参考方案1】:

对我来说,它使用上述方法有效,但前提是我在没有--help-选项的情况下调用我的应用程序(例如MyApp batch)。当我使用 MyApp --help batch 时,行为如您所述。

但是,对于 help-option,我们似乎无法获得相同的效果。

编辑:我设法通过修改Commandline.Parser.cs 的代码来实现这个工作:

private bool TryParseHelpVerb(string[] args, object options, Pair<MethodInfo, HelpVerbOptionAttribute> helpInfo, OptionMap optionMap)

    var helpWriter = _settings.HelpWriter;
    if (helpInfo != null && helpWriter != null)
    
        if (string.Compare(args[0], helpInfo.Right.LongName, GetStringComparison(_settings)) == 0)
        
            // User explicitly requested help
            var verb = args.FirstOrDefault(); // <----- change this to args[1];
            if (verb != null)
            
                var verbOption = optionMap[verb];
                if (verbOption != null)
                
                    if (verbOption.GetValue(options) == null)
                    
                        // We need to create an instance also to render help
                        verbOption.CreateInstance(options);
                    
                
            
            DisplayHelpVerbText(options, helpInfo, verb);
            return true;
        
    

    return false;

问题出现在一行

var verb = args.FirstOrDefault();

由于第一个参数 (args[0]) 被解释为动词或更好的 动作(如文档中所述)verb 在此处始终为help。所以我们用包含 actual 动词的args[1] 替换它,例如commit

EDIT2:为了使 --help 工作,我们还应该从 --character 中修剪第一个 arg (args[0])

if (string.Compare(args[0].Trim('-'), helpInfo.Right.LongName, GetStringComparison(_settings)) == 0)

【讨论】:

你能帮我在我的项目中做这些改变吗?我使用CommanLine 作为库。所以我不能改变它的源代码。然后我从 git 克隆 repo 并尝试找到 TryParseHelpVerb 函数或 DisplayHelpVerbText 但找不到任何东西。我需要做什么? 下载源代码,适当修改并构建为库。 我应该注意的每个人:您需要更改和编译“稳定”分支。成功编译后,您需要替换“bin\debug”文件夹和“packages\CommandLineParser\lib\net45”文件夹中的库。祝你好运!

以上是关于HelpVerbOption 不工作 - 命令行解析器 C#的主要内容,如果未能解决你的问题,请参考以下文章

windows 下借助7zip实现命令行解压缩

将 JSON 行解包到 pandas 数据框

Python将值行解压缩为两个数组

如何让 Firebird 客户端应用程序等待行解锁

使用 SSIS 2008 批量插入多个 XML 文件

Linux命令执行流程