接下来的代码打印当前目录中每个文件的属性,因为通配符处理。
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的二类目标,他们不在乎(或者它会打破太多的程序,但我不确定有那么多明确依赖于这种行为)。