猿问

定义一个同时具有强制参数和可选参数的选项

我目前正在尝试提出一种构建命令行选项的方法,该方法在提供时可以采用一个必需的参数或第二个可选参数(除了必需的参数之外)。我试图使用阿帕奇公地CLI来实现这一点。

即我的程序 -a [整数]

myProgram -a "test" --> isValid
myProgram -a "test" 2 --> also isValid

我试过:Option.builder("a").hasArg().numberOfArgs(2).optionalArg(true).build();

&

Option.builder("a").hasArg().numberOfArgs(2).build();

这两者都没有按预期工作。第一个示例使两个参数都是可选的,它允许传递违反要求的空参数。

第二个示例使这两个参数都成为必需参数,并且在仅提供字符串类型 arg 时失败。

我已经查看了commons cli的文档,但他们提供的用例没有涉及像这样的复杂案例,同样也没有从api文档中获得太多细节。

我希望程序在没有值的情况下提供 -a 时失败,但在提供 1 或 2 个参数时会成功,如前面所示。


慕码人2483693
浏览 97回答 3
3回答

慕盖茨4494581

过去,在这些情况下,我增加了第二个选项。所以在你的例子中,-b。-b [bvalue]   If -a is enabled, ensure that it uses bvalue to thinginate.如果第二个(可选)值充当标志,则它可以只是一个布尔标志。如果第二个(可选)值是一些更任意的输入,则第二个选项可以采用单个必需的参数。虽然我相信你有理由把你的参数组织成,但它通常会导致一个更有用的命令行,无论如何都没有这些多层的可选性(即选项中存在第二位可选值)。您可以将其视为两级和三级嵌套菜单之间的UX差异。由于项目数量有限,两级菜单通常更可用。(如果没有更具体的用例细节,答案必须是泛泛而谈的。-a reqdval optval

慕娘9325324

所以你有一个选项,可以提供零个或一个时间,可以有一个或两个值?final Options options = new Options()             .addOption(Option.builder("a").hasArg().hasArgs().build());CommandLine cmd = new DefaultParser().parse(options, args); LOG.debug(Arrays.asList(args).toString() + " : " + Arrays.asList(cmd.getOptionValues("a")).toString());DEBUG :: [-a, b] : [b] DEBUG :: [-a, b, c] : [b, c]您可能希望在提供太多或太少的参数时引发自己的分析异常。如果您想多次提供答案,请查看此答案:https://stackoverflow.com/a/64611857/8656281-a

青春有我

根据我对 appache-commons-cli 文档的理解(我可能是错的),似乎没有办法在每个参数的基础上设置“可选Arg”。另外,我看到它在示例中使用的方式,它似乎在两者之间使用分隔符的参数,如in而不是空格?我不确定这一点。-D<property>=<value>但是,是的,对于你想要的,你可以把它弄脏并允许可选参数,然后在选项没有必需的参数时拒绝它(违背了我知道使用commons-cli的目的)。编辑:您是否尝试过使用模式选项生成器?这个例子引起了我的兴趣:例如,以下内容允许命令行标志为“-v -p 字符串值 -f /dir/文件”。感叹号位于强制选项之前。&nbsp;Options&nbsp;options&nbsp;=&nbsp;PatternOptionBuilder.parsePattern("vp:!f/");它说感叹号可以在强制选项之前使用,但我不确定它是否可以与强制参数一起使用?不过我没有尝试过。
随时随地看视频慕课网APP

相关分类

Java
我要回答