由于通配符处理,下一个代码打印当前目录中每个文件的属性。
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*]
找到解决方法。 “*”; - 不是文件夹名称,但有效的类路径:
java -cp "*;" A
感谢。
答案 0 :(得分:4)
正如Ignacio Vazquez-Abrams已经指出的那样,在Windows上,shell 不会进行通配符扩展。这取决于应用程序。因此,你无法对shell做任何事情来阻止它做一些它本来不做的事情。
> echoargs.exe *
arg 1: *
因此,如果你的应用程序中的参数以某种方式被破坏,那么它肯定不是shell的错。
编辑:显然,Java“帮助”复制Unix行为并为您扩展所有通配符。以上echoargs
是用C#编写的,这就是问题没有显示的原因。
好的,从2004年开始进一步挖掘显示this bug report。这是因为Java与setargv
的不同版本链接,如here on MSDN所述,因此在命令行参数中扩展了通配符。这发生在Java甚至看到参数之前,因为这是C运行时启动代码。
此外,就我所发现的情况而言,这并没有在任何地方记录,上面链接的错误5036373甚至指出应该被记录。显然,没有解决这个问题。即使它无法将文字通配符传递给Java程序。显然,Windows确实只是Java的二级目标,他们并不关心(或者它会破坏太多的程序,但我不确定是否有那么多显然依赖于这种行为)。