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

Kon*_*kov 3 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);
}
Run Code Online (Sandbox Code Playgroud)

正则表达式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 \'.???'\ ...
Run Code Online (Sandbox Code Playgroud)

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

Ste*_*n C 8

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

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


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

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

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

但是,根据这个页面,在参数周围加上双引号会告诉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

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

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

但是,我认为写这篇文章的Oracle员工是故意的,因为通常的通配符扩展显然没有在那些"手动"页面中记录.他们只讨论-cp论证中的通配符扩展.