Java 如何使用Apache commons CLI解析文件模式

Java 如何使用Apache commons CLI解析文件模式,java,apache,command-line,apache-commons-cli,Java,Apache,Command Line,Apache Commons Cli,我正在尝试使用ApacheCommonsCLI解析我的命令行参数。这里的例子可能有点过于苛刻,但在我正在创建的程序的上下文中,这是有意义的。我正在尝试读取一个文件模式过滤器,类似于grep用来选择要处理的文件 我的论点是这样的: Program --input *.* 我已经编写了一个测试程序来查看解析器看到了什么 public static void main(String[] args) { Options options = new Options(); options

我正在尝试使用ApacheCommonsCLI解析我的命令行参数。这里的例子可能有点过于苛刻,但在我正在创建的程序的上下文中,这是有意义的。我正在尝试读取一个文件模式过滤器,类似于grep用来选择要处理的文件

我的论点是这样的:

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
我假设我必须做些事情来告诉ApacheCommons什么*不是特殊字符?我似乎在网上找不到关于这个的任何信息


我在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]);
         }
     }
}
。。。然后将使用参数数组
[“a”,“b”]
调用
MyClass.main()
——因为UNIX shell将
*
扩展到当前目录中的文件

可以通过转义来抑制此操作:

$ java -jar myjar MyClass *  // main() sees ["*"])
(请注意,UNIX shell不会将
*.
扩展到
.classpath
,因为此表单将忽略以
开头的“隐藏”文件)

在Windows上

cmd.exe
不执行UNIX风格的通配符扩展。如果将
*
作为参数提供给Windows中的命令,则该命令将获得一个文本
*
。因此,例如,
PKUNZIP*.zip
*.zip
传递到
PKUNZIP.EXE
,如果需要,由该程序来扩展通配符

由于Java 7的某些版本,Windows的Java可执行文件在将参数传递给
main()
类之前,会对其自身的文件名扩展执行一些通配符

我无法找到Java for Windows的通配符扩展规则的清晰文档,但您应该能够通过引用、转义引号来控制它,以防止cmd.exe解释它们:

> java.exe -jar myjar.jar MyClass """*.*"""

(未经测试,因为我手头没有Windows框,在cmd.exe中引用有点麻烦-请尝试并编辑以上内容或留下评论)

如果用引号括住
*.*
(尝试单引号和双引号)会发生什么?示例:
Program--input“*.*”
我刚刚更新了帖子,但这种情况发生在Windows7上。当我用单引号括起来时,它会打印出“.”(包括引号),当我用双引号括起来时,它会打印出“.classpath”不幸的是(或幸运的是:D)我没有Windows系统可供测试-但我认为,根据Windows的规则,
*.
匹配
.classpath
。有关Windows中转义引号的详细信息,请参阅。
> java.exe -jar myjar.jar MyClass """*.*"""