逃避通配符处理Java类路径(escape wildcard processing in java

2019-06-26 10:59发布

因通配符处理的当前目录下一个代码打印每个文件的属性。

c:\work>attrib *

我需要在我的脚本来禁用通配符处理。 逃逸符号不工作:

c:\work>attrib "*"
c:\work>attrib ^*

这两个给你相同的。

我需要禁用通配符处理开始我的应用程序,接受通配符作为参数。

A.java

import java.util.Arrays;

public class A {

    public static void main(String[] args) {
        System.out.println(Arrays.deepToString(args));
    }
}

CMD

C:\work\temp>start.bat

C:\work\temp>java -cp playground.jar A *
[activation.jar, file.txt, playground.jar, playground.jar.bak, start.bat, test.bat]

C:\work\temp>start.bat

C:\work\temp>java -cp playground.jar A "*"
[activation.jar, file.txt, playground.jar, playground.jar.bak, start.bat, test.bat]

C:\work\temp>start.bat

C:\work\temp>java -cp playground.jar A "* foo? *bar*"
[* foo? *bar*]

找到解决方法。 “*”; - 不falid文件夹名称,但有效的类路径:

java -cp "*;" A

谢谢。

Answer 1:

作为伊格纳西奥巴斯克斯-艾布拉姆斯已经指出,在Windows shell 不支持通配符扩展 。 这完全取决于应用程序。 因此,有没有什么可以做的外壳,从做一些它不能在第一时间做停止它。

> echoargs.exe *
arg 1: *

所以,如果你的应用程序的参数在某种程度上破坏,那么它肯定不是shell的错。

编辑:显然,Java的“有益”的副本Unix的行为,并扩展所有通配符为您服务。 上述echoargs是用C#编写,这就是为什么这个问题没有显示。

好吧,进一步挖掘揭示了这个bug报告 ,从2004年这是因为Java是用不同版本的链接setargv ,如所描述这里在MSDN上 ,从而扩大在命令行参数的通配符。 出现这种情况的Java甚至看到参数之前,因为这是C运行时启动代码。

此外,这不是任何地方,只要我能找到的文件,上面甚至链接错误5036373指出,它应该被记录在案。 没有修复为,显然。 尽管这使得它不可能通过文字通配符Java程序。 显然的Windows确实只是一个针对Java二等目标,他们不关心(或者它会打破太多的程序,但我不知道,就有多少是显式依赖此行为)。



文章来源: escape wildcard processing in java classpath