如何使用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)上遇到了这个问题。我很确定它是*。*这是导致问题,因为当我交换使用不使用*的模式时,预期的模式显示出来。

+0

会发生什么,如果你用引号括住'*。*'(尝试单引号和双引号)?例如:'Program --input“*。*”' – Rafa

+0

我刚更新了这篇文章,但是这发生在Windows 7上。当我用单引号括起来时,它会打印出'*。*'(包括引号),当我双引号时,它打印出'.classpath' – Andy

你的问题不是真的与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 worldjava 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报价是有点野兽的事 - 尽请尝试,可以编辑的上方或发表评论)

+0

我没有Windows系统来测试不幸(或幸运:D) - 但我认为这是合理的,通过Windows'规则'*。*'匹配'。 classpath'。 – slim

+0

请参阅https://stackoverflow.com/questions/562038/escaping-double-quotes-in-batch-script以获取更多关于Windows中转义引用的详细信息。 – slim