1

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

c:\work>attrib *

我需要在我的脚本中禁用通配符处理。转义符号不起作用:

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

两者都给你相同的。

我需要禁用通配符处理才能启动接受通配符作为参数的应用程序。

爪哇

import java.util.Arrays;

public class A {

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

命令

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

谢谢。

4

1 回答 1

4

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

> echoargs.exe *
arg 1: *

因此,如果您的应用程序中的参数以某种方式损坏,那么这绝对不是 shell 的错。

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

好的,进一步挖掘揭示了这个 2004 年的错误报告。这是因为Java与不同版本setargv的. 这发生在 Java 甚至看到参数之前,因为这是 C 运行时启动代码。

此外,据我所知,这在任何地方都没有记录,上面链接的错误 5036373 甚至指出应该记录它。显然,没有解决办法。即使它不可能将文字通配符传递给 Java 程序。显然,Windows 确实只是 Java 的二等目标,他们不在乎(否则它会破坏太多程序,但我不确定有多少程序明确依赖这种行为)。

于 2012-07-23T07:34:41.843 回答