2014-09-20 51 views
0

程序必须监视与掩码匹配的文件。文件夹名称和掩码通过命令行参数传递。但即使在我可以使用它之前,面具也会被第一场比赛取代!双引号也没有效果,也没有其他符号,例如我尝试过使用\或'来保护输入,然后这个符号将被添加到参数,而我不想要。任何想法如何解决它?Java命令行参数,停止扩展通配符符号

public static void main(String[] args) throws IOException { 
    File dir = new File(args[0]); 
    String mask = args[1]; 
    System.out.println(dir.getAbsolutePath()); 
    System.out.println(mask); 
    String regex = args[2]; 
    System.out.println(regex); 
} 

Regular expression from args[2] also replaced with some file from folder. 

Input: "E:\Programming\Java\Task7" *.??? ... 

Ouput: E:\Programming\Java\Task7 .git Task7.iml 

Input: "E:\Programming\Java\Task7" *.????* [a-zA-Z] 

Output: E:\Programming\Java\Task7 .idea [a-zA-Z] 

Input: "E:\Programming\Java\Task7" '.???' ... 

Output: E:\Programming\Java\Task7 '.???' ... 

Input: "E:\Programming\Java\Task7" \\'.???'\\ ... 

Output: E:\Programming\Java\Task7 \'.???'\ ... 

我知道使用引号或反斜杠并不是坏主意,但我认为存在更好的方法。

回答

4

背景:在Linux上,扩展命令参数中的通配符不是Java。在java命令启动之前,shell会执行

停止shell扩展通配符的方法是引用参数。你如何做到这一点取决于你正在使用的外壳。


现在对于Windows的情况......这是你真正问到的问题。

从我所读到的,标准的“cmd.exe”shell(在它的各种版本/风味)不会做通配符扩展。应用程序需要在特定的基础上进行扩展(或不扩展)。

显然这对于​​Java“一次编写,随处运行”的哲学来说是有问题的,所以Java设计者试图在命令行参数中使用通配符参数工作在Windows上,就像他们在Unix和Linux上一样。但不幸的是,他们无法做到完美的工作...因此这种异常。

但是,根据this page,将双引号放在参数的旁边会告诉Java不进行通配符扩展。

但是,如果这没有帮助,你可能运气不好。


下面是有关这个主题的一些链接Oracle文档,从Oracle的Java bug报告#5036373采取:在Windows平台上

的Java通配符扩展已经被记录在案。见 以下链接: http://connect.microsoft.com/VisualStudio/feedback/details/98756/vs2005-setargv-obj-wildcard-handling-broken

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/java.html

http://docs.oracle.com/javase/7/docs/technotes/tools/windows/classpath.html

通配符扩展不为 单个元素的classpath Windows命令外壳由于所描述的微软漏洞工作。

的限制将在7u10发行说明中还提到: http://www.oracle.com/technetwork/java/javase/7u10-relnotes-1880995.html

不过,我认为甲骨文的员工是谁写的,目前正在故意装傻,因为一般的通配符扩展显然是没有记录在那些“手动”页面中。他们只在-cp的论点中谈论通配符扩展。

+0

我知道它不是扩展通配符的java,而且我通过双引号或其他合适的符号(如\或'')保护输入不起作用。顺便说一下,我使用Windows cmd。 – 2014-09-20 12:33:52