如何使用Apache公共命令解析文件模式CLI
我想使用apache commons CLI解析我的命令行参数。对于这里的例子来说,这可能有点沉重,但在我创建的程序的上下文中是有道理的。我试图读取一个文件模式过滤器,类似于grep用来选择要处理的文件。如何使用Apache公共命令解析文件模式CLI
我的观点是这样的:
Program --input *.*
我写了一个测试程序,看看有什么解析器是看到;
public static void main(String[] args) {
Options options = new Options();
options.addOption(new Option(INPUT_FILTER_SHORT, INPUT_FILTER_LONG, true, INPUT_FILTER_DESCRIPTION));
CommandLineParser parser = new BasicParser();
CommandLine cmd = parser.parse(options, args);
System.out.println(cmd.getOptionValue(INPUT_FILTER_SHORT));
}
此打印出:
.classpath
如果我改变我的论点:
Program --input test.txt
我得到的输出:
test.txt
我假设我必须做一些事情来告诉apache commons是什么*不是特殊字符?我似乎无法找到关于此在线的任何内容。
我在Windows(7)上遇到了这个问题。我很确定它是*。*这是导致问题,因为当我交换使用不使用*的模式时,预期的模式显示出来。
你的问题不是真的与Commons CLI有关,而是与shell和Java可执行文件如何一起处理参数。
要消除等因素的影响,看看发生了什么事情,用很短的Java程序:
public class ArgsDemo {
public static void main(String[] args) {
for(int i=0; i<args.length; i++) {
System.out.println("" + i + ": " + args[i]);
}
}
}
播放与java ArgsDemo hello world
,java ArgsDemo *
等,并观察会发生什么。
在UNIX和Linux:
Java那样的*
无特殊处理。但是,的外壳确实是。所以,如果你做的事:
$ mkdir x
$ cd x
$ touch a b
$ java -jar myjar.jar MyClass *
...然后MyClass.main()
将与参数数组["a","b"]
调用 - 因为UNIX外壳程序扩展*
的文件在当前目录中。
您可以通过转义抑制这种:
$ java -jar myjar MyClass * // main() sees ["*"])
(注意,UNIX外壳将不会扩大到*.*
因为.classpath
这种形式会忽略开始.
“隐藏” 文件)
在窗口上
cmd.exe
不做UNIX样式通配符exp安森。如果您将*
作为参数提供给Windows中的某个命令,则该命令将获得一个文字*
。因此,例如,PKUNZIP *.zip
将*.zip
传递给PKUNZIP.EXE
,如果需要,它可以通过该程序来扩展通配符。
由于Java 7的一些版本,Java可执行文件为Windows做一些通配符文件名在本国的扩张,传递参数给你main()
类。
我已经无法找到的Java换Windows的通配符扩展规则明确的文件,但你应该能够使用引号,转义引号,以防止cmd.exe的解释它们来控制它:
> java.exe -jar myjar.jar MyClass """*.*"""
(未测试,因为我没有Windows盒旁边,然后输入cmd.exe报价是有点野兽的事 - 尽请尝试,可以编辑的上方或发表评论)
会发生什么,如果你用引号括住'*。*'(尝试单引号和双引号)?例如:'Program --input“*。*”' – Rafa
我刚更新了这篇文章,但是这发生在Windows 7上。当我用单引号括起来时,它会打印出'*。*'(包括引号),当我双引号时,它打印出'.classpath' – Andy