繁体   English   中英

在java类路径中转义通配符处理

[英]escape wildcard processing in 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*]

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

java -cp "*;" A

谢谢。

正如Ignacio Vazquez-Abrams已经指出的那样,在Windows上,shell 不会进行通配符扩展 这取决于应用程序。 因此,你无法对shell做任何事情来阻止它做一些它首先没做的事情。

> echoargs.exe *
arg 1: *

因此,如果应用程序中的参数以某种方式被破坏,那么它肯定不是shell的错。

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

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

此外,就我所知,在任何地方都没有记录,上面链接的错误5036373甚至指出它应该记录在案。 显然,没有解决这个问题。 即使它无法将文字通配符传递给Java程序。 显然,Windows确实只是Java的二级目标,他们并不关心(或者它会破坏太多的程序,但我不确定有那么多明确依赖于这种行为)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM