在java classpath中转义通配符处理

接下来的代码打印当前目录中每个文件的属性,因为通配符处理。

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*] 

find解决方法。 “*”; – 不是失败的文件夹名称,但有效的类path:

 java -cp "*;" A 

谢谢。

正如Ignacio Vazquez-Abrams所指出的,在Windows上,shell 不会进行通配符扩展 。 这取决于应用程序。 所以没有什么可以做到的,以阻止它做的事情,它不起首。

 > echoargs.exe * arg 1: * 

所以如果你的应用程序中的参数以某种方式被破坏了,那绝对不是shell的错。

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

好的,进一步的挖掘可以揭示2004年的这个bug报告 。这是因为Java被链接到了一个不同版本的setargv ,正如MSDN上描述的setargv ,因此在命令行参数中扩展了通配符。 这发生在Java甚至看到参数之前,因为这是C运行时启动代码。

而且,就我所能找到的任何地方而言,这都没有记录在案,甚至连上面提到的bug 5036373都应该记录下来。 没有解决,显然。 尽管它使得不可能将文字通配符传递给Java程序。 显然Windows确实只是Java的二类目标,他们不在乎(或者它会打破太多的程序,但我不确定有那么多明确依赖于这种行为)。