停止将命令行参数中的通配符扩展为Java

时间:2014-09-20 12:21:50

标签: java shell cmd wildcard-expansion

我的程序必须监视与掩码匹配的文件。文件夹名称和掩码通过命令行参数传递。但是在我使用之前,面具会被第一场比赛取代!

双引号也没有效果,也有其他符号。我尝试使用\'来保护输入。然而,这个符号将被添加到args中,这是我不想要的。知道怎么解决它?

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);
}

来自args[2]的正则表达式也替换为文件夹中的某些文件。

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 \'.???'\ ...

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

1 个答案:

答案 0 :(得分:8)

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

阻止shell扩展通配符的方法是引用参数。如何执行此操作取决于您使用的shell。


现在针对Windows案例......这就是你真正要问的问题。

根据我的阅读,标准的“cmd.exe”shell(各种版本/版本)不进行通配符扩展。应用程序可以在临时的基础上进行扩展(或不进行扩展)。

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

但是,根据this page,在参数周围加上双引号会告诉Java不要进行外卡扩展。

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


以下是有关此主题的Oracle文档的一些链接,这些链接取自Oracle Java错误报告#5036373

  

已记录Windows平台上的Java Wildcard扩展。看到   以下链接:

     

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

     

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

     

通配符扩展在Windows的命令shell中不起作用   单个元素类路径,因为在以下描述的Microsoft错误:   http://connect.microsoft.com/VisualStudio/feedback/details/98756/vs2005-setargv-obj-wildcard-handling-broken

     

7u10发行说明中也提到了这些限制:   http://www.oracle.com/technetwork/java/javase/7u10-relnotes-1880995.html

但是,我认为撰写该文章的Oracle员工故意使用故障,因为通常的通配符扩展通常不会记录在那些“手动”页面中。他们只讨论-cp参数中的通配符扩展。